সি (C) একটি সাধারণ, শক্তিশালী এবং প্রাচীন প্রোগ্রামিং ভাষা যা ডেভেলপারদের জন্য মৌলিক প্রোগ্রামিং কৌশল শিখতে সহায়তা করে। সি ভাষার সাহায্যে বিভিন্ন ধরনের অ্যাপ্লিকেশন এবং সিস্টেম প্রোগ্রামিং তৈরি করা হয়। এটি একটি কম্পাইলড, স্ট্যাটিক্যালি টাইপড, এবং প্রসেডুরাল ভাষা। সি ভাষায় অনেক অন্যান্য প্রোগ্রামিং ভাষার মূল ধারণা পাওয়া যায়, যেমন ডাটা টাইপস, কন্ডিশনাল স্টেটমেন্টস, লুপস, ফাংশনস ইত্যাদি।
এই টিউটোরিয়ালে সি প্রোগ্রামিং ভাষার বেসিক ধারণা এবং মূল বিষয়গুলো আলোচনা করা হবে।
সাধারণ একটি সি প্রোগ্রাম দেখতে এরকম হবে:
#include // Header file for input-output functions
int main() {
printf("Hello, World!\n"); // Print statement
return 0; // Return 0 to indicate successful execution
}
ব্যাখ্যা:
#include
: এটি একটি হেডার ফাইল যা ইনপুট এবং আউটপুট সম্পর্কিত ফাংশনগুলো (যেমন printf()
) প্রোগ্রামে অন্তর্ভুক্ত করে।int main()
: এটি প্রধান ফাংশন যা সি প্রোগ্রামের শুরু পয়েন্ট। main
ফাংশন থেকেই প্রোগ্রাম চালু হয়।printf("Hello, World!\n");
: এটি একটি স্ট্যাটমেন্ট যা স্ক্রীনে Hello, World! প্রিন্ট করে।return 0;
: এটি ফাংশন থেকে সফলভাবে প্রোগ্রাম সম্পন্ন করার সিগন্যাল দেয়।সি প্রোগ্রামে বিভিন্ন ধরনের ডেটা সংরক্ষণ করা হয় ভেরিয়েবল এর মাধ্যমে। ডেটা টাইপ নির্ধারণ করে ভেরিয়েবলের কোন ধরনের ডেটা ধারণ করা হবে। সি ভাষায় সাধারণ ডেটা টাইপস গুলি হল:
int
: পূর্ণসংখ্যা (Integer)float
: দশমিক সংখ্যা (Floating Point Number)double
: উচ্চ মানের দশমিক সংখ্যা (Double Precision Floating Point Number)char
: একক অক্ষর (Character)ভেরিয়েবল ডিক্লেয়ারেশন উদাহরণ:
#include
int main() {
int age = 25; // Integer
float height = 5.9; // Float
double weight = 70.5; // Double
char grade = 'A'; // Character
printf("Age: %d\n", age);
printf("Height: %.1f\n", height);
printf("Weight: %.2f\n", weight);
printf("Grade: %c\n", grade);
return 0;
}
ব্যাখ্যা:
int age = 25;
: একটি পূর্ণসংখ্যা ভেরিয়েবল age
ডিক্লেয়ার করা হয়েছে এবং এর মান 25
দেয়া হয়েছে।float height = 5.9;
: একটি দশমিক সংখ্যা ভেরিয়েবল height
ডিক্লেয়ার করা হয়েছে এবং এর মান 5.9
দেয়া হয়েছে।double weight = 70.5;
: একটি উচ্চ মানের দশমিক সংখ্যা weight
ডিক্লেয়ার করা হয়েছে এবং এর মান 70.5
দেয়া হয়েছে।char grade = 'A';
: একটি অক্ষর ভেরিয়েবল grade
ডিক্লেয়ার করা হয়েছে এবং এর মান 'A'
দেয়া হয়েছে।কন্ডিশনাল স্টেটমেন্টস ব্যবহার করে প্রোগ্রাম শর্তসাপেক্ষে কার্যকরী হতে পারে। সি প্রোগ্রামে if
, else
, এবং switch
স্টেটমেন্ট ব্যবহৃত হয়।
if
স্টেটমেন্ট উদাহরণ:
#include
int main() {
int a = 10, b = 20;
if (a > b) {
printf("a is greater than b\n");
} else {
printf("b is greater than or equal to a\n");
}
return 0;
}
ব্যাখ্যা:
if (a > b)
: যদি a
এর মান b
থেকে বড় হয়, তাহলে প্রথম ব্লকটি কার্যকর হবে, অন্যথায় else
ব্লকটি কার্যকর হবে।switch
স্টেটমেন্ট উদাহরণ:
#include
int main() {
int num = 2;
switch (num) {
case 1:
printf("One\n");
break;
case 2:
printf("Two\n");
break;
case 3:
printf("Three\n");
break;
default:
printf("Number is not 1, 2 or 3\n");
}
return 0;
}
ব্যাখ্যা:
switch (num)
: এখানে, num
এর মান অনুযায়ী নির্দিষ্ট কোড ব্লক কার্যকর হয়।break
: একটি break
স্টেটমেন্ট ব্যবহার করা হয় যাতে একাধিক case
ব্লকের মধ্যে ঝুলে না যায়।লুপ ব্যবহৃত হয় কোনো কাজ বার বার করার জন্য। সি প্রোগ্রামে for
, while
, এবং do-while
লুপ ব্যবহৃত হয়।
for
লুপ উদাহরণ:
#include
int main() {
for (int i = 0; i < 5; i++) {
printf("Iteration %d\n", i);
}
return 0;
}
ব্যাখ্যা:
for (int i = 0; i < 5; i++)
: এটি ০ থেকে ৪ পর্যন্ত লুপ চালায় এবং প্রতিটি পুনরাবৃত্তির জন্য মান i
প্রিন্ট করে।while
লুপ উদাহরণ:
#include
int main() {
int i = 0;
while (i < 5) {
printf("Iteration %d\n", i);
i++;
}
return 0;
}
ব্যাখ্যা:
while (i < 5)
: এটি i
এর মান ৫ এর কম থাকলে লুপ চালায় এবং প্রতিটি পুনরাবৃত্তির জন্য মান i
প্রিন্ট করে।সি প্রোগ্রামে কোড পুনরায় ব্যবহারযোগ্য করতে ফাংশন ব্যবহার করা হয়। এটি কোডের কার্যকারিতা ভাগ করে আনে এবং প্রোগ্রাম সহজে পড়া ও রক্ষণাবেক্ষণযোগ্য করে।
ফাংশন উদাহরণ:
#include
// Function declaration
int add(int a, int b);
int main() {
int result = add(5, 3);
printf("Sum: %d\n", result);
return 0;
}
// Function definition
int add(int a, int b) {
return a + b;
}
ব্যাখ্যা:
int add(int a, int b)
: এটি একটি ফাংশন যা দুইটি পূর্ণসংখ্যার যোগফল ফেরত দেয়।int result = add(5, 3);
: এই লাইনে ফাংশন কল করা হয় এবং result
এ তার মান সংরক্ষিত হয়।পয়েন্টার একটি ভেরিয়েবল যা অন্য কোনো ভেরিয়েবলের মেমরি ঠিকানা ধারণ করে। সি প্রোগ্রামে পয়েন্টার খুবই গুরুত্বপূর্ণ, কারণ এর মাধ্যমে ডেটার সরাসরি অ্যাক্সেস এবং মেমরি ম্যানেজমেন্ট করা সম্ভব হয়।
পয়েন্টার উদাহরণ:
#include
int main() {
int num = 10;
int *ptr = # // Pointer that stores the address of num
printf("Value of num: %d\n", num);
printf("Address of num: %p\n", &num);
printf("Pointer points to value: %d\n", *ptr);
return 0;
}
ব্যাখ্যা:
int *ptr = #
: এটি একটি পয়েন্টার ptr
তৈরি করে যা num
ভেরিয়েবলের মেমরি ঠিকানা ধারণ করে।*ptr
: এটি পয়েন্টারের মাধ্যমে ভেরিয়েবলের মান অ্যাক্সেস করে।সি প্রোগ্রামিং ভাষা একটি শক্তিশালী ভাষা যা বিভিন্ন ধরনের অ্যাপ্লিকেশন এবং সিস্টেম প্রোগ্রামিং তৈরিতে ব্যবহৃত হয়। সি প্রোগ্রামে ভেরিয়েবল, কন্ডিশনাল স্টেটমেন্টস, লুপস, **ফাংশনস
**, পয়েন্টারস এবং মেমরি ম্যানেজমেন্ট এর মাধ্যমে কার্যকরী প্রোগ্রাম তৈরি করা হয়। সি প্রোগ্রামিং ভাষা শিখতে হলে এই মৌলিক বিষয়গুলি পুরোপুরি বোঝা এবং প্র্যাকটিস করা খুবই গুরুত্বপূর্ণ।
সি প্রোগ্রামিং সাধারণ উদ্দেশ্যে(general-purpose) ব্যবহৃত একটি শক্তিশালী(powerfull) প্রোগ্রামিং ভাষা যা দ্রুততর(faster), বহনযোগ্য(portable) এবং সব ধরণের প্লাটফর্মেই উপযোগী।
আপনি যদি প্রোগ্রামিং এ নতুন হোন, তাহলে সি দিয়ে প্রোগ্রামিং এ যাত্রা শুরু হবে আপনার জন্য দারুণ এক পছন্দের বিষয়।
আপনি কিভাবে সি প্রোগ্রামিং ভাষা শেখা শুরু করবেন, কেনই বা সি প্রোগ্রামিং ভাষা শিখবেন এবং কোথায় থেকে শিখবেন পরবর্তী অধ্যায় গুলোতে তারই কিছু তুলনামূলক দিক তুলে ধরার চেষ্টা করেছি।
সি প্রোগ্রামিং ভাষা শেখা শুরু করার পূর্বে চলুন সি প্রোগ্রামিং ভাষাটির সঙ্গে পরিচিত হয়ে নিই।
সি সাধারণ উদ্দেশ্যে ব্যবহৃত প্রোগ্রামিং ভাষা। বিভিন্ন অপারেটিং সিস্টেম (যেমন-উইন্ডোজ, আইওএস, লিন্যাক্স ইত্যাদি) থেকে শুরু করে নানা ধরনের সফটওয়্যার নির্মানে সি এর ব্যপক ব্যবহার রয়েছে। এমনকি 3D মুভি তৈরি করতেও সি ব্যবহৃত হয়। এক কথায়, এমন কোনো ক্ষেত্র নাই যেখানে সি এর পদচারনা নাই।
সি একটি অত্যন্ত কার্যকরী(highly efficient) প্রোগ্রামিং ভাষা । প্রায় ৪৪ বছরেরও বেশি সময় ধরে জনপ্রিয় থাকার এটাই হয়ত মূল কারণ।
স্টান্ডার্ড সি প্রোগ্রাম বহনযোগ্য(portable)। একটি সিস্টেমের জন্য লিখিত কোড কোনো ধরণের পরিবর্তন ছাড়াই অন্য অপারেটিং সিস্টেমে কাজ করে।
আমরা ইতিমধ্যেই উল্লেখ করেছি যে, প্রোগ্রামিং শেখা শুরু করার জন্য সি একটি সহজ ও সুন্দর ভাষা। আপনি যদি সি প্রোগ্রামিং জানেন, তাহলে আপনি শুধু সি প্রোগ্রাম কিভাবে কাজ করে এটাই বুঝবেন না, বরং কম্পিউটার কিভাবে কাজ করে তার একটি মানষিক চিত্র আঁকতে পারবেন।
ইউনিক্স অপারেটিং সিস্টেমের সাথে সি প্রোগ্রামিং অত্যন্ত সম্পর্কযুক্ত। এই অধ্যায়ে সি প্রোগ্রামিং এর ইতিহাস সম্পর্কে আলোচনা করা হয়েছে।
ইউনিক্স সিস্টেমের ভার্সন-PDP-11 এসেম্বলি ল্যাঙ্গুয়েজ দিয়ে লেখা। এসেম্বলি ল্যাঙ্গুয়েজ হলো লো-লেভেল(low-level) প্রোগ্রামিং ল্যাঙ্গুয়েজ। যা শুধু নির্দিষ্ট কোনো প্লাটফর্মের জন্য লেখা হয়। ইহা লেখা এবং বুঝাও অনেক কঠিন।
ইউনিক্স অপারেটিং সিস্টেমের ডেভেলপার ডেনিশ রিচি এবং স্টেফেন সি. জনশন সিস্টেমকে পূনরায় বি ল্যাঙ্গুয়েজে লেখার সিদ্ধান্ত নিলেন। যাইহোক, PDP-11 এর কিছু বৈশিষ্ট্য বি এর জন্য পর্যাপ্ত ছিলনা, যা তাদেরকে সি ল্যাঙ্গুয়েজ ডেভেলপমেন্টের জন্য পরিচালিত করেছিল।
১৯৭২ সালে ইউনিক্স সিস্টেম PDP-11-এ সি এর ডেভেলপমেন্ট শুরু হয়। তখন উনিক্স এর বিশাল অংশ পূনরায় সি দিয়ে লেখা হয়েছিল। ১৯৭৩ সালে ইউনিক্স কার্নেলে সি যথেষ্ট শক্তিশালি ভাষা হিসাবে ব্যবহৃত হয়েছিল। ডেনিশ রিচি এবং স্টেফেন সি. জনশন ভাষাটিকে ইউনিক্স অপারেটিং সিস্টেমে বহনযোগ্য করে তোলার জন্য কয়েক বছর ধরে ইহাতে আরোও কিছু পরিবর্তন এনেছিলেন।
১৯৭৮ সালে সি প্রোগ্রামিং এর প্রথম বই "The C Programming Language" প্রকাশিত হয়েছিল। বইটির প্রথম সংস্করণ প্রোগ্রামারদের কাছে অনেক বছর যাবৎ ভাষাটির সাধারণ বর্ণনা সর্বরাহ করেছিল। ব্রায়ান কার্নিংহাম এবং ডেনিশ রিচি কর্তৃক লেখা এই বইটি "K&R" নামে অনেক জনপ্রিয়।
সি ল্যাঙ্গুয়েজ কয়েক বছরের মধ্যেই দ্রুত বৃদ্ধি পাওয়ায় ভাষাটির জন্য কিছু নিয়ম(standard) ঠিক করে দেওয়ার প্রয়োজন হয়েছিল।
C89: ১৯৮৯ সালে আমেরিকান ন্যাশন্যাল স্টান্ডার্ড ইন্সটিটিউট(ANSI) কর্তৃক সি এর প্রথম স্টান্ডার্ড প্রকাশিত হয়েছিল। সি এর এই ভার্সনটি প্রোগ্রামারদের কাছে C89 নামে জনপ্রিয় ছিল।
C99: ১৯৯৯ সালে সি স্টান্ডার্ডে আরো নতুন কিছু বৈশিষ্ট্য যেমন- নতুন ইনলাইন ফাংশন, নতুন ডাটাটাইপ ইত্যাদি সংযুক্ত করা হয়েছিল। ইহা প্রোগ্রামারদের কাছে C99 নামে পরিচিত ছিল।
C11: C11 এ নতুন কিছু বৈশিষ্ট্য যেমন- টাইপ জেনেরিক ম্যাক্রো,অটোমিক অপারেশন এবং এনোনিমাস স্ট্রাকচার যোগ করা হয়েছে যেগুলো C99 এ ছিল না।
এই সবগুলো স্টান্ডার্ড আনসি সি নামেও পরিচিত।
“স্টান্ডার্ড সি প্রোগ্রাম বহযোগ্য”. ইহার অর্থ হচ্ছে, আনসি সি অনুসরণ করে লেখা প্রোগ্রাম অপারেটিং সিস্টেম গুলোর মধ্যে স্থানান্তরযোগ্য।
আপনি যদি সি প্রোগ্রামিং এ নতুন হয়ে থাকেন তাহলে আমদের পরামর্শ হলো আনসি সি অনুসরণ করে প্রোগ্রামিং লেখার যা সকল ক্ষেত্রেই গ্রহণযোগ্য। ইহা আপনাকে ভাষাটি লেখার উদ্দ্যেশ্য বুঝতে সহায়তা করবে।
সি এর মত প্রোসিডিউরাল(procedural) ল্যাঙ্গুয়েজে পূর্বনির্ধারিত কিছু ইন্সট্রাকশন ধাপে ধাপে সম্পন্ন হয়। একটি কাজ সম্পন্ন করার জন্য একটি আদর্শ সি প্রোগ্রামে এক বা একের অধিক প্রোসিডিউর বা ফাংশন থাকতে পারে। আপনি যদি প্রোগ্রামিং এ নতুন হয়ে থাকেন, তাহলে আপনি ভাবতে পারেন যে, এটাই একমাত্র পদ্ধতি যে পদ্ধতিতে সকল প্রোগ্রামিং ল্যাঙ্গুয়েজ কাজ করে।
যাইহোক, এছাড়া প্রোগ্রামিং এর অন্যান্য কৌশলও(paradigm) রয়েছে। এদের মধ্যে সচারচর ব্যবহৃত একটি কৌশল হলো অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং(OOP) যা কোনো কার্য সম্পাদনের জন্য ডেভেলপারদেরকে অবজেক্ট তৈরিতে অনুমতি দেয়।
সি প্রোগ্রাম দ্রুততর
সি এর তুলনায় নতুন ল্যাঙ্গুয়েজ জাভা এবং পাইথন অনেক ধরণের বৈশিষ্ট্য যেমন- গার্বেজ কালেকশন(garbage collection) এবং ডাইনামিক টাইপিং(dynamic typing) অফার করে। ইহা প্রোগ্রামারদের জন্য প্রোগ্রাম লেখাও সহজ করে দেয়। যাইহোক, অতিরিক্ত প্রোসেসিং এর কারণে সি এর তুলনায় এদের পারফর্মেন্স কম।
সি ল্যাঙ্গুয়েজ প্রোগ্রামারদেরকে বিশ্বাস করে এবং সরাসরি কম্পিউটার হার্ডওয়ারের মাধ্যমে প্রোগ্রাম সম্পাদনে সম্মতি দেয়। কিন্তু অধিকাংশ হাই-লেভেল প্রোগ্রামিং ল্যাঙ্গুয়েজের ক্ষেত্রে ইহা সম্ভব নয়। সি প্রোগ্রামিং শেখা শুরু করার ইহা অন্যতম কারণ।
স্টান্ডার্ড সি প্রোগ্রাম বহনযোগ্য
“একবার লিখে সকল প্লাটফর্মে কম্পাইল করা যায়”। আনসি স্টান্ডার্ডে ভালভাবে লেখা সি প্রোগ্রাম বহনযোগ্য(portable), এই কথার অর্থ হলো, এক সিস্টেম(যেমন- উইন্ডোজ)-এর জন্য লেখা প্রোগ্রাম কোনো ধরণের পরিবর্তন ছাড়াই অন্য প্লাটফর্ম(যেমন- লিন্যাক্স)-এ কম্পাইল করা যায়।
মডিউলার(Modular)-এর ব্যবহার
আপনি সি প্রোগ্রামকে ভিন্ন ভিন্ন সেকশন বা ফাংশনে ভাগ করে লাইব্রেরীর মধ্যে রাখতে পারেন। প্রোগ্রামিং এর এই ধারনা মডিউলারিটি(modularity) নামে পরিচিত।
সি নিজে নিজে খুবই ছোট্ট একটি ভাষা। কিন্তু সি এর আসল শক্তি হলো এর বিশাল লাইব্রেরী আছে। সি এর কিছু স্টান্ডার্ড লাইব্রেরী আছে যা দিয়ে সাধারণ সমস্যাসমূহ সমাধান করা যায়। ধরুন, আপনি স্ক্রিনে কিছু প্রদর্শন করাতে চাচ্ছেন, তাহলে আপনি আপনার প্রোগ্রামে “stdio.h” লাইব্রেরী সংযোগ করতে পারেন যা আপনাকে স্ক্রিনে কিছু প্রদর্শনের জন্য printf() ফাংশন ব্যবহারের অনুমতি দেয়।
স্টাটিক্যালি টাইপ ল্যাঙ্গুয়েজ
সি একটি স্টাটিক্যালি টাইপ ল্যাঙ্গুয়েজ(statically typed language)। এর অর্থ হলো, ভ্যারিয়েবলের টাইপ রান টাইমে নয় বরং কম্পাইল টাইমে চেক হয়। ইহা সফটওয়্যার ডেভেলপমেন্ট সাইকেলের সময় error খুঁজতে সহায়তা করে। এছাড়া ডাইনামিক্যালি টাইপ ল্যাঙ্গুয়েজের তুলনায় স্টাটিক্যালি টাইপ ল্যাঙ্গুয়েজ সাধারণত দ্রুততর হয়।
সাধারণ উদ্দেশ্যে(General purpose)
পূর্ববর্তী বিষয়সমূহ ছাড়াও বিভিন্ন ধরণের এপ্লিকেশন যেমন- সিস্টেম সফটওয়্যার থেকে শুরু করে ফটো এডিটিং সফটওয়ারেও সি ল্যাঙ্গুয়েজ ব্যবহৃত হয়। সি ল্যাঙ্গুয়েজ ব্যবহৃত কিছু এপ্লিকেশন নিম্নে তুলে ধরা হলোঃ
এমবেডেড সিস্টেম(Embedded System)
অপারেটিং সিস্টেম - উইন্ডোজ, লিন্যাক্স, ওএস এক্স, এন্ড্রোয়েড, আইওএস
ডাটাবেজ - মাইএসকিউএল, অরাকল, এমএস এসকিউএল সার্ভার, পোস্টগ্রিএসকিউউএল
অন্যান্য ব্যবহার -নেটওয়ার্ক ড্রাইভার, কম্পাইলার, প্রিন্ট স্পুলার
ইউনিক্স অপারেটিং সিস্টেমের সাথে সি প্রোগ্রামিং অত্যন্ত সম্পর্কযুক্ত। এই অধ্যায়ে সি প্রোগ্রামিং এর ইতিহাস সম্পর্কে আলোচনা করা হয়েছে।
ইউনিক্স সিস্টেমের ভার্সন-PDP-11 এসেম্বলি ল্যাঙ্গুয়েজ দিয়ে লেখা। এসেম্বলি ল্যাঙ্গুয়েজ হলো লো-লেভেল(low-level) প্রোগ্রামিং ল্যাঙ্গুয়েজ। যা শুধু নির্দিষ্ট কোনো প্লাটফর্মের জন্য লেখা হয়। ইহা লেখা এবং বুঝাও অনেক কঠিন।
ইউনিক্স অপারেটিং সিস্টেমের ডেভেলপার ডেনিশ রিচি এবং স্টেফেন সি. জনশন সিস্টেমকে পূনরায় বি ল্যাঙ্গুয়েজে লেখার সিদ্ধান্ত নিলেন। যাইহোক, PDP-11 এর কিছু বৈশিষ্ট্য বি এর জন্য পর্যাপ্ত ছিলনা, যা তাদেরকে সি ল্যাঙ্গুয়েজ ডেভেলপমেন্টের জন্য পরিচালিত করেছিল।
১৯৭২ সালে ইউনিক্স সিস্টেম PDP-11-এ সি এর ডেভেলপমেন্ট শুরু হয়। তখন উনিক্স এর বিশাল অংশ পূনরায় সি দিয়ে লেখা হয়েছিল। ১৯৭৩ সালে ইউনিক্স কার্নেলে সি যথেষ্ট শক্তিশালি ভাষা হিসাবে ব্যবহৃত হয়েছিল। ডেনিশ রিচি এবং স্টেফেন সি. জনশন ভাষাটিকে ইউনিক্স অপারেটিং সিস্টেমে বহনযোগ্য করে তোলার জন্য কয়েক বছর ধরে ইহাতে আরোও কিছু পরিবর্তন এনেছিলেন।
১৯৭৮ সালে সি প্রোগ্রামিং এর প্রথম বই "The C Programming Language" প্রকাশিত হয়েছিল। বইটির প্রথম সংস্করণ প্রোগ্রামারদের কাছে অনেক বছর যাবৎ ভাষাটির সাধারণ বর্ণনা সর্বরাহ করেছিল। ব্রায়ান কার্নিংহাম এবং ডেনিশ রিচি কর্তৃক লেখা এই বইটি "K&R" নামে অনেক জনপ্রিয়।
সি ল্যাঙ্গুয়েজ কয়েক বছরের মধ্যেই দ্রুত বৃদ্ধি পাওয়ায় ভাষাটির জন্য কিছু নিয়ম(standard) ঠিক করে দেওয়ার প্রয়োজন হয়েছিল।
C89: ১৯৮৯ সালে আমেরিকান ন্যাশন্যাল স্টান্ডার্ড ইন্সটিটিউট(ANSI) কর্তৃক সি এর প্রথম স্টান্ডার্ড প্রকাশিত হয়েছিল। সি এর এই ভার্সনটি প্রোগ্রামারদের কাছে C89 নামে জনপ্রিয় ছিল।
C99: ১৯৯৯ সালে সি স্টান্ডার্ডে আরো নতুন কিছু বৈশিষ্ট্য যেমন- নতুন ইনলাইন ফাংশন, নতুন ডাটাটাইপ ইত্যাদি সংযুক্ত করা হয়েছিল। ইহা প্রোগ্রামারদের কাছে C99 নামে পরিচিত ছিল।
C11: C11 এ নতুন কিছু বৈশিষ্ট্য যেমন- টাইপ জেনেরিক ম্যাক্রো,অটোমিক অপারেশন এবং এনোনিমাস স্ট্রাকচার যোগ করা হয়েছে যেগুলো C99 এ ছিল না।
এই সবগুলো স্টান্ডার্ড আনসি সি নামেও পরিচিত।
“স্টান্ডার্ড সি প্রোগ্রাম বহযোগ্য”. ইহার অর্থ হচ্ছে, আনসি সি অনুসরণ করে লেখা প্রোগ্রাম অপারেটিং সিস্টেম গুলোর মধ্যে স্থানান্তরযোগ্য।
আপনি যদি সি প্রোগ্রামিং এ নতুন হয়ে থাকেন তাহলে আমদের পরামর্শ হলো আনসি সি অনুসরণ করে প্রোগ্রামিং লেখার যা সকল ক্ষেত্রেই গ্রহণযোগ্য। ইহা আপনাকে ভাষাটি লেখার উদ্দ্যেশ্য বুঝতে সহায়তা করবে।
সি একটি প্রোসিডিউরাল ল্যাঙ্গুয়েজ
সি এর মত প্রোসিডিউরাল(procedural) ল্যাঙ্গুয়েজে পূর্বনির্ধারিত কিছু ইন্সট্রাকশন ধাপে ধাপে সম্পন্ন হয়। একটি কাজ সম্পন্ন করার জন্য একটি আদর্শ সি প্রোগ্রামে এক বা একের অধিক প্রোসিডিউর বা ফাংশন থাকতে পারে। আপনি যদি প্রোগ্রামিং এ নতুন হয়ে থাকেন, তাহলে আপনি ভাবতে পারেন যে, এটাই একমাত্র পদ্ধতি যে পদ্ধতিতে সকল প্রোগ্রামিং ল্যাঙ্গুয়েজ কাজ করে।
যাইহোক, এছাড়া প্রোগ্রামিং এর অন্যান্য কৌশলও(paradigm) রয়েছে। এদের মধ্যে সচারচর ব্যবহৃত একটি কৌশল হলো অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং(OOP) যা কোনো কার্য সম্পাদনের জন্য ডেভেলপারদেরকে অবজেক্ট তৈরিতে অনুমতি দেয়।
সি প্রোগ্রাম দ্রুততর
সি এর তুলনায় নতুন ল্যাঙ্গুয়েজ জাভা এবং পাইথন অনেক ধরণের বৈশিষ্ট্য যেমন- গার্বেজ কালেকশন(garbage collection) এবং ডাইনামিক টাইপিং(dynamic typing) অফার করে। ইহা প্রোগ্রামারদের জন্য প্রোগ্রাম লেখাও সহজ করে দেয়। যাইহোক, অতিরিক্ত প্রোসেসিং এর কারণে সি এর তুলনায় এদের পারফর্মেন্স কম।
সি ল্যাঙ্গুয়েজ প্রোগ্রামারদেরকে বিশ্বাস করে এবং সরাসরি কম্পিউটার হার্ডওয়ারের মাধ্যমে প্রোগ্রাম সম্পাদনে সম্মতি দেয়। কিন্তু অধিকাংশ হাই-লেভেল প্রোগ্রামিং ল্যাঙ্গুয়েজের ক্ষেত্রে ইহা সম্ভব নয়। সি প্রোগ্রামিং শেখা শুরু করার ইহা অন্যতম কারণ।
স্টান্ডার্ড সি প্রোগ্রাম বহনযোগ্য
“একবার লিখে সকল প্লাটফর্মে কম্পাইল করা যায়”। আনসি স্টান্ডার্ডে ভালভাবে লেখা সি প্রোগ্রাম বহনযোগ্য(portable), এই কথার অর্থ হলো, এক সিস্টেম(যেমন- উইন্ডোজ)-এর জন্য লেখা প্রোগ্রাম কোনো ধরণের পরিবর্তন ছাড়াই অন্য প্লাটফর্ম(যেমন- লিন্যাক্স)-এ কম্পাইল করা যায়।
মডিউলার(Modular)-এর ব্যবহার
আপনি সি প্রোগ্রামকে ভিন্ন ভিন্ন সেকশন বা ফাংশনে ভাগ করে লাইব্রেরীর মধ্যে রাখতে পারেন। প্রোগ্রামিং এর এই ধারনা মডিউলারিটি(modularity) নামে পরিচিত।
সি নিজে নিজে খুবই ছোট্ট একটি ভাষা। কিন্তু সি এর আসল শক্তি হলো এর বিশাল লাইব্রেরী আছে। সি এর কিছু স্টান্ডার্ড লাইব্রেরী আছে যা দিয়ে সাধারণ সমস্যাসমূহ সমাধান করা যায়। ধরুন, আপনি স্ক্রিনে কিছু প্রদর্শন করাতে চাচ্ছেন, তাহলে আপনি আপনার প্রোগ্রামে “stdio.h” লাইব্রেরী সংযোগ করতে পারেন যা আপনাকে স্ক্রিনে কিছু প্রদর্শনের জন্য printf() ফাংশন ব্যবহারের অনুমতি দেয়।
স্টাটিক্যালি টাইপ ল্যাঙ্গুয়েজ
সি একটি স্টাটিক্যালি টাইপ ল্যাঙ্গুয়েজ(statically typed language)। এর অর্থ হলো, ভ্যারিয়েবলের টাইপ রান টাইমে নয় বরং কম্পাইল টাইমে চেক হয়। ইহা সফটওয়্যার ডেভেলপমেন্ট সাইকেলের সময় error খুঁজতে সহায়তা করে। এছাড়া ডাইনামিক্যালি টাইপ ল্যাঙ্গুয়েজের তুলনায় স্টাটিক্যালি টাইপ ল্যাঙ্গুয়েজ সাধারণত দ্রুততর হয়।
সাধারণ উদ্দেশ্যে(General purpose)
পূর্ববর্তী বিষয়সমূহ ছাড়াও বিভিন্ন ধরণের এপ্লিকেশন যেমন- সিস্টেম সফটওয়্যার থেকে শুরু করে ফটো এডিটিং সফটওয়ারেও সি ল্যাঙ্গুয়েজ ব্যবহৃত হয়। সি ল্যাঙ্গুয়েজ ব্যবহৃত কিছু এপ্লিকেশন নিম্নে তুলে ধরা হলোঃ
- এমবেডেড সিস্টেম(Embedded System)
- অপারেটিং সিস্টেম - উইন্ডোজ, লিন্যাক্স, ওএস এক্স, এন্ড্রোয়েড, আইওএস
- ডাটাবেজ - মাইএসকিউএল, অরাকল, এমএস এসকিউএল সার্ভার, পোস্টগ্রিএসকিউউএল
- অন্যান্য ব্যবহার -নেটওয়ার্ক ড্রাইভার, কম্পাইলার, প্রিন্ট স্পুলার
যদি শুধুমাত্র হ্যাঁ অথবা না দ্বারা এই প্রশ্নের উত্তর দেওয়া সম্ভব হত! দুর্ভাগ্যবশত, এই প্রশ্নের উত্তর দেওয়া খুব সহজ নয় কারণ ইহা ব্যক্তি থেকে ব্যক্তিতে ভিন্ন হয়।
ব্যক্তিগতভাবে বললে, আমি সি প্রোগ্রামিংকে ভালবাসি। আপনি যদি প্রোগ্রামিং এ একেবারে নতুন হয়ে থাকেন, তাহলে প্রোগ্রামিং এ যাত্রা শুরুর জন্য সি হবে আপনার জন্য একটি অসাধারণ প্রোগ্রামিং ভাষা। আপনি যদি দক্ষ প্রোগ্রামার হয়ে থাকেন, তাহলে কিছু পয়েন্টের উপর ভিত্তিকরে ইহা শেখার জন্য আমরা আপনাকে সুপারিশ করছি, নিশ্চিতভাবে যা আপনাকে সাহায্য করবে।
আপনি যদি সি প্রোগ্রামিং না জানেন, তাহলে প্রোগ্রামার হিসাবে আপনি কি করছেন তাই জানবেন না। । আপনার এপ্লিকেশন খুব সুন্দরভাবে এবং সব ধরণের কাজ করবে ঠিকই। কিন্তু আপনি যদি বলতে না পারেন কেন ইহা
(*s++ = *p++);
স্ট্রিং কপি করে, তাহলে আপনি অন্ধবিশ্বাসে প্রোগ্রামিং করেন।
কম্পিউটার কিভাবে কাজ করে আপনি তা জানবেন
আপনি যদি সি জানেন, তাহলে আপনি শুধুমাত্র প্রোগ্রাম কিভাবে কাজ করে তাই জানবেন না। বরং আপনি মেমোরি ম্যানেজমেন্ট এবং বরাদ্দ(allotment)সহ কম্পিউটার কিভাবে কাজ করে তার একটি মানসিক মডেল তৈরি করতে পারবেন। প্রোগ্রামিং এ সি যে স্বাধীনতা দিয়ে থাকে আপনি তার তারিফ করবেন। কেননা অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজ যেমন- পাইথন এবং জাভা এই সুবিধা দেয় না।
আপনি যদি একবার সি বুঝতে পারেন, তাহলে আপনি এমন এমন প্রোগ্রাম লিখতে পারবেন যে, আপনি ভেবেছিলেন কখনোই ইহা আপনার দ্বারা সম্ভব না । অথবা অন্ততপক্ষে, আপনি কম্পিউটার আর্কিটেকচার এবং প্রোগ্রামিং এর উপর বৃহত্তর ধারনা পাবেন।
সি হলো প্রোগ্রামিং এর মিশ্র ভাষা(lingua franca)
প্রায় সকল হাই-লেভেল প্রোগ্রামিং ল্যাঙ্গুয়েজ যেমন- জাভা, পাইথন, পিএইচপি, জাভাস্ক্রিপ্ট ইত্যাদি সি প্রোগ্রামিং এর সাথে যোগাযোগ করতে পারে। এছাড়া, সাধারণ আইডিয়াসমূহ প্রোগ্রামিং এর মাধ্যমে প্রকাশ করার জন্যও ইহা একটি ভাল ভাষা। আপনি যার সাথে কথা বলছেন সে সি প্রোগ্রাম না জানলেও কিছু যায় আসে না, সে যেভাবে বুঝে সে পদ্ধতিতেই আপনি আপনার আইডিয়া এখনোও তার সাথে শেয়ার করতে পারবেন।
ওপেন সোর্স প্রোজেক্টে কাজ করার সুযোগ পাবেন যা লক্ষ লক্ষ মানুষকে প্রভাবিত করে।
সি যে একটি গুরত্বপূর্ণ ভাষা প্রথমে তা আপনি উপেক্ষা করতে পারেন। কেননা আপনি যদি মোবাইল এপ্স ডেভেলপ করতে চান তাহলে এন্ড্রোয়েড এর জন্য লাগবে জাভা, আইওএস এর জন্য লাগবে সুইফট এবং অবজেক্টিভ সি। ওয়েব এপ্লিকেশন তৈরির জন্য ডজন খানেক প্রোগ্রামিং ল্যাঙ্গুয়েজ যেমন পিএইচপি, জাভাস্ক্রিপ্ট, সি#, রুবি, পাইথন ইত্যাদি আছে। তাহলে সি প্রোগ্রামিং কোথায় গেল?
বিভিন্ন ধরণের এপ্লিকেশন তৈরিতে পাইথন ব্যবহৃত হয়। পাইথন তৈরিতে সি ব্যবহৃত হয়। আপনি যদি পাইথনে অবদান রাখতে চান তাহলে পাইথন ইন্টারপ্রেটার এ সি কিভাবে কাজ করে তা আপনাকে জানতে হবে যা লক্ষ লক্ষ পাইথন প্রোগ্রামারকে প্রভাবিত করবে। ইহা শুধুমাত্র একটি উদাহরণ। এছাড়াও সি দিয়ে তৈরি বহুসংখ্যক সফটওয়্যার আছে যেগুলো আপনি প্রতিনিয়ত ব্যবহার করেন
কিছু বড় বড় ওপেন সোর্স প্রোজেক্ট (যেমন- এসকিউলাইট ডাটাবেজ, লিনাক্স কার্নেল, পাইথন ইন্টারপ্রেটার) রয়েছে যেগুলোতে সি প্রোগ্রামিং ব্যবহৃত হয়।
অন্য আরেকটি ভাষা আছে যা বড় বড় ওপেন সোর্স প্রোজেক্টে ব্যবহৃত হয় তা হলো সি++। আপনি যদি সি এবং সি++ জানেন, তাহলে আপনি অনেক ওপেন সোর্স প্রোজেক্টে অবদান রাখতে পারবেন যা লক্ষ লক্ষ মানুষকে প্রভাবিত করবে।
আপনি সেরা প্রোগ্রাম লিখতে পারবেন
সততার সাথে বললে, ইহা সব সময় সত্য নাও হতে পারে। যাইহোক, আপনি যদি জানেন কম্পিউটার কিভাবে কাজ করে এবং কিভাবে মেমোরি ম্যানেজ করে তাহলে অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজেও যথার্থ কোড লিখতে পারবেন।
অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজ শেখা সহজ হয়ে যাবে।
অনেক জনপ্রিয় প্রোগ্রামিং ল্যাঙ্গুয়েজ আছে যেগুলো সি এর উপর ভিত্তি করে তৈরি। যেমন- সি++ অবজেক্ট ওরিয়েন্টেড বৈশিষ্ট্যসহ সি এর সুপার সেট হিসাবে বিবেচনা করা হয়। আপনি যদি সি জানেন, তাহলে সি++ শেখাও আপনার জন্য অনেক সহজ হবে।
সি# এবং জাভা প্রোগ্রামিং সি এবং সি++ এর সাথে সম্পর্কযুক্ত। জাভাস্ক্রিপ্ট এবং পিএইচপি এর সিনট্যাক্স সি এর মতই।
আপনি যদি সি এবং সি++ প্রোগ্রামিং জানেন তাহলে অন্যন্য ভাষায় স্যুইচ করতে আপনাকে কোনো ধরণের বেগ পেতে হবে না।
আপনি সি প্রোগ্রামিং না শিখেই অসাধারণ অসাধারণ সফটওয়্যার তৈরি করতে পারবেন। Stackoverflow.com এর প্রতিষ্ঠাতা জেফ আটওয়ার্ড মোটেও সি প্রোগ্রামিং জানতেন না। কিন্তু স্টেক অভারফ্লো নিঃসন্দেহে অনেক ভাল একটি ওয়েব এপ্লিকেশন।
আপনি যদি ব্যস্ত মানুষ হোন এবং ঐ সকল ক্ষেত্রে আপনি সময় বিনিয়োগ করতে না চান যার মাধ্যমে আপনার দৈনন্দিন কাজে প্রত্যক্ষ্য কোনো প্রভাব নেই। তাহলে সি প্রোগ্রামিং আপনার জন্য নয়।
আপনি যদি প্রোগ্রামিং এ একেবারেই নতুন হয়ে থাকেন এবং প্রোগ্রামিং শেখার জন্য খুব সহজ ভাষা খুঁজছেন তাহলে সি আপনার জন্য খুব সহজ হবে না। বরং আপনি পাইথন দিয়ে শুরু করতে পারেন।
নতুনদের জন্যঃ
প্রোগ্রামিং শেখা শুরু করার জন্য অনেকের কাছে সি হলো সর্বোত্তম ভাষা। যাইহোক, আপনি যদি সহজ এবং স্বচ্ছ ভাষা দিয়ে প্রোগ্রামিং শেখা শুরু করতে চান, তাহলে পাইথন দিয়ে শুরু করুন।
অভিজ্ঞ প্রোগ্রামারদের জন্যঃ
সি প্রোগ্রামিং শেখার অত্যন্ত প্রয়োজন নাই কিন্তু সি শেখার কিছু ভাল দিকও রয়েছে।
সি শেখার জন্য আপনি আপনার চলমান প্রোজেক্ট বন্ধ করে দিয়েন না। আমার বিশ্বাস, আপনি এটা করবেনও না। যদি আপনার ফ্রি সময় থাকে এবং প্রোগ্রামিং দক্ষতাকে সমৃদ্ধ করতে চান তাহলে আপনি সি শিখতে পারেন।
আমি বিশ্বাস করি, তাৎক্ষনিকভেবে এটা শেখার প্রয়োজন নাই। তবে কোনো না কোনোভাবে এটা আপনার শেখা উচিৎ।
এই অধ্যায়ে আমারা কম্পাইলার সম্মন্ধে জানবো এবং সি এর জন্য কম্পাইলার ইন্সটলেশন/সেটাপ করা শিখবো।
কম্পাইলার হলো কম্পিউটার প্রোগ্রাম বা প্রোগ্রাম-সমষ্টি যা কোনো প্রোগ্রামিং ভাষাকে অপর একটি প্রোগ্রামিং ভাষায় রূপান্তরিত করে। বেশীর ভাগ ক্ষেত্রে কোনো প্রোগ্রামের সোর্স কোডকে মেশিনকোডে রূপান্তরের জন্য কম্পাইলার ব্যবহৃত হয়।
আমাদের এই টিউটোরিয়ালটি যেহেতু সি প্রোগ্রামিং বিষয়ক সুতরাং আমাদেরকেও এমন একটি কম্পাইলার ব্যবহার করতে হবে যা আমাদের সি এর সোর্স কোডকে মেশিন কোডে রূপান্তরিত করবে।
সি প্রোগ্রামিং রান করানোর জন্য অনলাইনে বহুসংখ্যক কম্পাইলার এবং টেক্সট এডিটর দেখতে পাবেন। এই সকল টেক্সট এডিটর এবং কম্পাইলার এক সিস্টেম থেকে অন্য সিস্টেমে ভিন্ন হতে পারে।
আপনার নিজের কম্পিউটারে(Windows, Mac OSX এবং Linux এ) সহজ পদ্ধতিতে কিভাবে সি প্রোগ্রাম রান করাবেন তা এই সেকশনে তুলে ধরা হয়েছে
অনলাইনে সি প্রোগ্রামিং রান করানোর অনেক সাইট রয়েছে। কিন্তু আমি আপনাকে ideone.com এর সুপারিশ করছি।
Ideone.com এ সি প্রোগ্রামিং রান করানোর জন্য এডিটরের নিচে থেকে সি ল্যাঙ্গুয়েজ সিলেক্ট করুন, সি কোড লিখুন এবং রান বাটনে এ ক্লিক করুন।
ইহাও জানানো উচিৎ যে, অনলাইন সি কম্পাইলারে কিছু সীমাবদ্ধতা আছে। যেমন- আপনি ফাইল নিয়ে কাজ করতে পারবেন না, ইউজার থেকে ইনপুট প্রাকৃতিক হবে না ইত্যাদি।
2. download Xcode লিংকে ক্লিক করুন। আমরা আপনাকে Xcode এর লেটেস্ট ভার্সন্টি ডাউনলোড করার জন্য সুপারিশ করছি।এমনকি সেটা যদি বেটা(beta) ভার্সনও হয়।
3. ডাউনলোড সম্পন্ন হলে Xcode ওপেন করে ইন্সটলের ইন্সট্রাকশনসমূহ অনুসরণ করুন। আপনি Xcode কে পরবর্তী সময়ে ব্যবহার করতে চাইলে Applications এর মধ্যে রাখতে পারেন।
4. তারপরে Xcode ওপেন করে File > New > Project এ যান।
5. OS X সেকশনের নিচে Application কে সিলেক্ট করে Command Line Tool ওপেন করুন
6. Product Name সরবরাহ করুনঃ উদাহরণস্বরূপঃ Hello এবং Language সেকশন থেকে C সিলেক্ট করে next বাটনে ক্লিক করুন।
7. আপনার ম্যাকের কোথায় প্রোজেক্টটি সংরক্ষণ করতে চাচ্ছেন তার লোকেশন ঠিক করে দিন। আপনি যদি গিট রিপোজিটোরি তৈরি করতে না চান, তাহলে Create Git repository বাটনে ক্লিক করে আনচেক করতে পারেন, create বাটনে ক্লিক করুন।
8. ন্যাভিগেশন করে main.c ফাইলে যান যেখানে, XCode কর্তৃক সর্বরাহকৃত C এর ডিফল্ট কোড দেখতে পাবেন ।
9. আপনার ইচ্ছামত কোড পরিবর্তন করুন। এবং সবশেষে কোড রান করানোর জন্য Product > Run এ যান অথবা Cmd + R কমাড দিন।
10. আপনি আপনার স্ক্রিনের নিচে ডিফল্টভাবে ফলাফল দেখতে পাবেন।
লিনাক্সে সি প্রোগ্রামিং রান করানোর জন্য আপনার নিচের বিষয়সমূহ প্রয়োজন হবেঃ
- একটি কম্পাইলার। GNU GCC কম্পাইলার ইন্সটল করুন। কারণ ইহা নতুনদের জন্য অনেক সহজ
- ডেভেলপমেন্ট টুলস এবং লাইব্রেরী
- একটি টেক্সট এডিটর
লিনাক্সে (Ubuntu, Debian, CentOS, Fedora, Red Hat এবং Scientific Linux) সি প্রোগ্রাম রান করানোর পদ্ধতি ধাপে ধাপে দেখানো হলোঃ
$ sudo apt-get update
$ sudo apt-get install build-essential manpages-dev
CentOS, Fedora, Red Hat এবং Scientific Linux এর জন্যঃ
# yum groupinstall 'Development Tools'
ইহা আপনার সিস্টেমে GNU GCC এবং ইহা সম্পর্কিত টুলস ইন্সটল করবে।
2. GCC কম্পাইলার ইন্সটল হয়েছে কিনা যাচাই করার জন্য নিচের কমান্ড ব্যবহার করেন।
$ gcc --version
3. আপনার পছন্দের টেক্সট এডিটর ওপেন করে .c এক্সটেনশন দিয়ে একটি ফাইল সংরক্ষণ করুন। এখানে আমরা gEdit ব্যবহার করে hello.c নামে ফাইল সংরক্ষণ করেছি।
আপনি আপনার লিনাক্স সিস্টেমে যেকোনো এডিটর যেমন- vim, emacs ইত্যাদি ব্যবহার করতে পারেন। যেকোনো এডিটরই ভাল, তবে .c এক্সটেনশন দিতে ভুল করবেন না। কারণ ইহা খুবই গুরুত্বপূর্ণ।
4. ফাইল যেখানে আছে সেই ডিরেক্টরিতে যান এবং নিচের কমান্ড দেন।
$ gcc program-source-code.c -o name-of-your-choice
এখানে program-source.code.c হলো ইতিপূর্বে ব্যবহৃত আপনার ফাইলের নাম এবং name-of-your-choice হলো আপনার পছন্দের যেকোনো নাম। আমরা এখানে $ gcc hello.c -o hello কমান্ড ব্যবহার করেছি।
5. যদি কোনো error না থাকে তাহলে একটি সম্পাদনযোগ্য ফাইল তৈরি হবে; আমাদের ক্ষেত্রে hello নামের ফাইল তৈরি হয়েছে
6. সবশেষে নিচের কমান্ড ব্যবহার করে আউটপুট দেখতে পারেন।
$ ./hello
উইন্ডোজে সি প্রোগ্রামিং রান করানোর জন্য Code::Blocks সফটওয়্যারটি ডাউনলোড করুন। তারপরে সি কোড লিখে .c এক্সটেনশন দিয়ে ফাইলে সংরক্ষণ করুন এবং কোড এক্সিকিউট করুন।
এই পদ্ধতিকে আরোও সহজ করার জন্য নিচের ধাপমমূহ অনুসরণ করুন।
যদি আপনার প্রোগ্রাম রান না করে এবং যদি error ম্যাসেজ "can't find compiler executable in your search path(GNU GCC compiler)" দেখায়, তাহলে Settings > Compiler > Toolchain executables এ যান এবং Auto-detect এ ক্লিক করুন। অধিকাংশ ক্ষেত্রেই এধরণের সমস্যা এই পদ্ধতিতে সমাধান হয়ে যায়।
“Hello, World!” প্রোগ্রাম লেখার পূর্বে চলুন জেনে নেয়া যাক, সি প্রোগ্রামিং ল্যাংগুয়েজের একটি সাধারণ প্রোগ্রাম কি কি উপাদান নিয়ে গঠিত হয়।
সি প্রোগ্রামিং এ নিম্নোক্ত উপাদান/অংশসমূহ থাকেঃ
Hello, World!” হলো একেবারে সাধারণ প্রোগ্রাম যা স্ক্রিনে “Hello, World!” প্রদর্শন করাবে। ইহা খুবই সাধারণ প্রোগ্রাম হওয়ায় প্রোগ্রামিং ল্যাঙ্গুয়েজের সিনট্যাক্স ব্য্যাখ্যা করার জন্য ব্যবহৃত হয়।
নতুনদের কাছে কোনো প্রোগ্রামিং ল্যাঙ্গুয়েজ সহজে পরিচিত করে দেওয়ার জন্য ইহা ব্যবহার করা হয়। সুতরাং চলুন শুরু করিঃ
#include
int main()
{
printf("Hello, World!\n");
return 0;
}
আপনার প্রোগ্রামে stdio.h
হেডার ফাইল সংযুক্ত করুন।
সি প্রোগ্রামিং ছোট হওয়ায় ইহা নিজে নিজে খুব বেশী কিছু করতে পারে না। আপনার প্রোগ্রাম রান করানোর জন্য কিছু ফাইলের প্রয়োজন হবে।
stdio.h
হলো হেডার(header) ফাইল এবং কম্পাইলার এই ফাইলের লোকেশন(location) জানে।আপনার প্রোগ্রামে এই হেডার ফাইল ব্যবহারের জন্য
#include
প্রিপ্রোসেসর(preprocessor) এর মাধ্যমে ইহাকে সংযুক্ত করতে হবে।
এই প্রোগ্রামে আপনাকে কেন stdio.h ফাইল যোগ করতে হবে?
এই প্রোগ্রামে আমরা
printf()
ফাংশন ব্যবহার করেছি। যা উদ্ধৃতি চিহ্নের(quotation mark) ভেতরের লেখাকে স্ক্রিনে বা কনসোলে প্রদর্শন(display) করাবে।printf()
ফাংশন ব্যবহারের জন্য আপনাকে আপনার প্রোগ্রামে অবশ্যইstdio.h
হেডার ফাইলে সংযুক্ত করতে হবে।
সি main()
ফাংশন
সি প্রোগ্রামে main() ফাংশন থেকে কোড সম্পাদন(execution) শুরু হয়। এক্ষেত্রে
main()
ফাংশন শুরুতে না থাকলেও কোনো যায় আসে না।কারলি ব্রাসেস(curly braces) { } এর ভেতরের কোড হলো
main()
ফাংশনের body। সি প্রোগ্রামেmain()
ফাংশন বাধ্যতামূলক।
int main() {
//ফাংশন body
}
উপরের প্রোগ্রামটি কোনো কিছুই করে না। কিন্তু ইহা বৈধ সি প্রোগ্রাম।
সি printf()
ফাংশন
printf()
ফাংশন হলো লাইব্রেরী ফাংশন যা স্ক্রিনে আউটপুট দেয়। আমাদের প্রোগ্রামে ইহা স্ক্রিনে Hello, World! আউটপুট দিবে।মনে রাখবেন, এই কাজ করার জন্য আপনার প্রোগ্রামে
stdio.h
হেডার ফাইল সংযোজন করতে হবে।লক্ষ্য করলে দেখবেন যে, প্রিন্ট ফাংশনের শেষে সেমিকোলন দেওয়া হয়েছে। স্টেটমেন্ট শেষ করার জন্য সেমিকোলন ব্যবহৃত হয়।
সি return
স্টেটমেন্ট
return স্টেটমেন্ট
0
রিটার্ন করেmain()
ফাংশনের কাজ সমাপ্ত করে। এই স্টেটমেন্ট বাধ্যতামূলক নয়। কিন্তু প্রোগ্রামিং এ ইহা ব্যবহার করা খুবই ভাল।
প্রয়োজনীয় নিয়মাবলী যা মনে রাখতে হবে
- সকল সি প্রোগ্রাম
main()
ফাংশন দিয়ে শুরু হয় এবং ইহা বাধ্যতামূলক।- আপনি প্রয়োজনীয় হেডার ফাইলসমূহ ব্যবহার করতে পারেন যা আপনার প্রোগ্রামে প্রয়োজন হতে পারে। উদাহরণস্বরূপঃ কোনো সংখ্যার বর্গমূল নির্ণয়ের জন্য
sqrt()
ফাংশন ব্যবহার করতে পারেন এবং পাওয়ার নির্ণয়ের জন্যpow()
ফাংশন ব্যবহার করতে পারেন। এজন্য আপনাকে আপনার প্রোগ্রামেmath.h
হেডার ফাইল সংযোজন করতে হবে।- সি হলো কেস-সেনসিটিভ(case-sensitive)। অর্থাৎ ছোট হাতের অক্ষর এবং বড় হাতের অক্ষর ভিন্ন অর্থে ব্যবহৃত হয়।
- সি প্রোগ্রাম
main()
ফাংশনের মধ্যে যখনই কোনো return স্টেটমেন্টে পৌঁছে তখনই সি প্রোগ্রাম বন্ধ হয়ে যায়। যাইহোক,main()
ফাংশনে return স্টেটমেন্ট বাধ্যতামূলক নয়।- সেমিকোলনের(;) মাধ্যমে সি প্রোগ্রামে স্টেটমেন্ট শেষ হয়।
এই অধ্যায়ে আপনি সি প্রোগ্রামের প্রবাহ সম্মন্ধে জানবেন।
সি প্রোগ্রাম এক্সিকিউশনের সময় অনেকগুলো স্টেপ অনুসরণ করে। সি প্রোগ্রামের ফ্লো বুঝতে হলে চলুন প্রথমে একটি সহজ উদাহরণ দেখা যাকঃ
#include
void main(){
printf("Hello SATT Family");
}
চলুন নিচের চিত্রের মাধ্যমে উপরের প্রোগ্রামটির ফ্লো বুঝার চেষ্টা করি
- সি প্রোগ্রাম(সোর্স কোড) কে প্রথমে প্রিপ্রসেসরের কাছে পাঠানো হয়। প্রিপ্রোসেসর এক্সপান্ডেড সোর্স কোডে রূপান্তরিত করে।
- এক্সপান্ডেড সোর্স কোড কম্পাইলারের কাছে পাঠানো হয় যা কোড কম্পাইল করে এসেম্বলি কোডে রূপান্তরিত করে।
- এসেম্বলি কোড এসেম্বলারের কাছে পাঠানো হয় যা কোড এসেম্বলি করে এবং অবজেক্ট কোডে রূপান্তরিত করে।
- অবজেক্ট কোড লিংকারের কাছে পাঠানো হয় যা লাইব্রেরী যেমন- হেডার ফাইলের সাথে লিংক করে। তারপরে ইহা এক্সিকিউটেবল কোডে রূপান্তরিত হয়।
- এক্সিকিউটেবল কোড লোডারের কাছে পাঠানো হয় যা মেমোরিতে লোড করে এবং কোড এক্সিকিউশন হয়। এক্সিকিউশন শেষে কনসোলে আউটপুট দেখায়।
স্যাট-এ ডজন ডজন টিউটোরিয়াল এবং উদাহরণ রয়েছে যা আপনাকে একেবারে শুরু থেকে সি প্রোগ্রামিং শিখতে সহায়তা করবে।
আমাদের টিউটোরিয়ালটি একেবারে নতুনদের জন্য যাদের সি অথবা অন্য কোনো প্রোগ্রামিং ভাষা সম্মন্ধে পূর্বের কোনো জ্ঞান নাই। প্রতিটি টিউটোরিয়াল-ই উদাহরণ এবং বিশদ ব্যখ্যাসহ নিবিড়ভাবে লেখা হয়েছে।
সত্যঃ আপনি একদিনেই সি প্রোগ্রামিং শিখতে পারবেন না। আপনি যদি অনেক দ্রুত সি প্রোগ্রামিং শেখার চেষ্টা করেন তাহলে গুরুত্বপূর্ণ ধারণাসমুহ উপলব্ধিতে সমস্যায় পড়তে পারেন।
আপনি যদি শুধু সিনট্যাক্স শিখে সি প্রোগ্রামিং এ কোড করা শুরু করেন, তাহলে আপনার কোড অনেক ভাল কাজ করবে ঠিকই। কিন্তু সঠিক পদ্ধিতে আপনার সি প্রোগ্রামিং শেখা শেষ হবে না।
স্যাট-এ ডজন ডজন উদাহরণ রয়েছে যা আপনাকে সি প্রোগ্রামিং বুঝতে সহায়তা করবে। যাইহোক আপনি যদি এই প্রোগ্রামগুলো আপনার সিস্টেমে রান করানো ছাড়া শুধুমাত্র নোবেল পড়ার মত পড়ে যান, তাহলে আপনি ভুল করবেন।
আপনি যদি প্রোগ্রামিং এর নতুন নতুন বৈশিষ্ট্য জানতে চান, তাহলে ঐ বৈশিষ্ট্যের সাথে সম্পর্কযুক্ত কোড লেখার চেষ্টা করুন। আমরা আপনাকে আমাদের উদাহরণগুলো নিয়ে চেষ্টা এবং রান করানোর জন্য উৎসাহিত করছি।
আপনি প্রোগ্রামগুলো একবার বুঝে গেলে, এগুলো পরিবর্তন করুন এবং নতুন কিছু তৈরির চেষ্টা করুন। কেননা প্রোগ্রামিং শেখার এটাই সর্বত্তোম পন্থা।
ডিবাগিং টুল অথবা ডিবাগার(Debugger) হলো এক ধরণের সফটওয়্যার যা প্রোগ্রামারকে যে কোনো পয়েন্টে প্রোগ্রাম বন্ধ করার অনুমতি দেয় এবং error সংশোধনে সহায়তা করে। IDE এর মধ্যে ডিফল্টভাবেই ডিবাগিং টুলস থাকে।
আপানর প্রোগ্রামে বাগ(bugs) থাকলে একেবারে শুরু থেকে বাগ খুঁজার চেয়ে আপনি ডিবাগার ব্যবহার করে যেকোনো পয়েন্টে প্রোগ্রাম থামিয়ে দিতে পারেন এবং বাগ সনাক্ত করার জন্য ভ্যারিয়েবলের ভ্যালু খুঁজে বের করতে পারেন।
কিভাবে ডিবাগার ব্যবহার করতে হয় তা জানা খুবই গুরুত্বপূর্ণ এবং প্রত্যেক প্রোগ্রামারেরই ইহা জানা উচিৎ।
পরিস্থিতির কথা ভাবুনঃ একটি সমস্যা array এর মাধ্যমে সমাধান করা সম্ভব। ইহা structure দিয়েও সমাধান করা সম্ভব। টেকনিক্যালি(technically) দুটো পদ্ধতিই সঠিক। আপনি কোনটা ব্যবহার করবেন?
এই প্রশ্নের উত্তর দেওয়ার জন্য array এবং structure এর ব্যবহার সম্মন্ধে আপনার ভাল জ্ঞান থাকতে হবে।
আপনি যদি অন্য কোনো প্রোগ্রামিং ল্যাঙ্গুয়েজ যেমন সি# থেকে সি ল্যঙ্গুয়েজে সুইচ করেন। তাহলে আপনি নিশ্চয় সি# স্টাইলে সি প্রোগ্রামের কোড লিখতে চাইবেন না।
আপনি যখন সাধারণ সি প্রোগ্রাম লিখতে পারবেন, তখন আরোও ভাল কিছু করার জন্য অনলাইন কমিউনিটি এবং ফোরামের সাথে যুক্ত হোন। আপনি যখন সমস্যায় পড়বেন, তখন সমাধানের জন্য সাহায্য চাইলে, তারা আপনাকে সমস্যা সমাধানে সহযোগিতা করবে।
স্যাট একাডেমী আপনাকে নিম্নের কমিউনিটিতে যুক্ত থাকার জন্য সুপারিশ করছেঃ
- সি প্রোগ্রামিং গুগল ফোরাম - নতুনদের জন্য খুবই ভাল একটি ফোরাম সাইট
- Codechef - প্রোগ্রামারদের বিশাল কমিউনিটি। যেখানে আপনি প্রশ্ন অনুশীলন করতে পারবেন এবং প্রশ্ন করতেও পারবেন।
- StackOverflow - অনেক জনপ্রিয় প্রোগ্রামিং প্রশ্ন-উত্তর সাইট।
উত্তম পন্থায় কোড লিখা হলো একটি অলিখিত দলিল যা সফটওয়্যারের কোয়ালিটি বৃদ্ধি করে এবং ডেভেলপমেন্টের জন্য সময়ও সাশ্রয় হয় ।
নিম্নে উল্লেখিত কিছু প্রোগ্রামিং প্রথা সকল প্রোগ্রামের জন্য বৈধ এবং কিছু শুধুমাত্র সি প্রোগ্রামিং এর জন্য বৈধঃ
সঙ্গতিপূর্ণ কোড বিন্যাস করুন
সি প্রোগ্রামিং এ আপনি কত সংখ্যক স্পেস ব্যবহার করছেন সেটা কোনো ব্যাপার নয়। কিন্তু তার মানে এই নয় যে, আপনি যেখানে সেখানে যাচ্ছেতাই স্পেস ব্যবহার করবেন। সর্বদা এমনভাবে কোড ইন্ডেন্টেশন(indentetion) ব্যবহার করুন যেন খুব সহজেই কোড বুঝা যায়।
প্রত্যেক স্টেটমেন্টের জন্য একটি করে লাইন ব্যবহার করুন।
নিচের কোডে কি ভুল আছে?
int count; float squareRoot = 10.0; printf(“Square root = %f”, squareRoot);
প্রকৃতপক্ষে উপরের কোডে কোনো ভুল নাই। কিন্তু ইহা কোড লেখার জন্য উত্তম পন্থা নয়।
int count;
float squareRoot = 10.0;
printf(“Square root = %f”, squareRoot);
উপরে লিখিত কোডের উদ্দেশ্য হচ্ছে অন্য কেউ কোড দেখলে যেন খুব সহজেই বুঝতে পারে।
সংগতিপূর্ণ এবং রীতি অনুসারে নামের ব্যবহার
কাজের সাথে সঙ্গতি রেখে ভ্যারিয়েবল এবং ফাংশনের নাম দিন।
int a, b;
এখানে , a এবং b দুটি ভ্যারিয়েবল এবং এগুলোকে কি কাজে ব্যবহার করা হয়েছে তার কিছুই আমি বুঝতে পারছি না। এর পরিবর্তে নিচের নায় অর্থপূর্ণ নাম রাখুন।
int counter, power;
এছাড়া নাম রাখার কিছু রীতিও অণুসরণ করুন। উদাহরণস্বরূপঃ
int base_number, powerNumber;
একের বেশি শব্দকে আলাদা করার জন্য আন্ডারস্কোর এবং ক্যামেল কেস উভয় পদ্ধতিই ব্যবহার করা হয়। যাইহোক, একই প্রোগ্রামে উভয় পদ্ধতি ব্যাবহার না করে যেকোনো একটি ব্যবহার করুন।
কমেন্ট ব্যবহারের অভ্যাস করুন
কমেন্ট কোডের অংশ এবং কম্পাইলার ইহাকে এড়িয়ে যায়।
আপনি আপনার প্রোগ্রামের মাধ্যমে কি করতে চাচ্ছেন তা কমেন্টের মাধ্যমে সংক্ষেপে ব্যখ্যা করতে পারেন। ইহা আপনার অনুসারী প্রোগ্রামারকে খুব সহজে কোড বুঝতে সাহায্য করবে।
ডাবল স্ল্যাস(//) ব্যবহার করে আপনি সি প্রোগ্রামিং এ সিঙ্গেল লাইন কমেন্ট করতে পারেন।
মাল্টি-লাইন কমেন্টের জন্য স্ল্যাস-এস্টারিস্ক(/*) ...কমেন্ট... এস্টারিস্ক-স্ল্যাস (*/) ব্যবহার করুন।
kt_satt_skill_example_id=21
“ কোডে কমেন্ট করা এবং নিয়মিত বাথরুম পরিষ্কার করা একই কথা। আপনি ইহা কখনোই করতে চান না। কিন্তু যদি করেন তাহলে আপনি সহ আপনার আত্মীয় স্বজনরাও ইহা ব্যবহার করে খুব আনন্দিত হবে।”
— রেয়ান ক্যাম্পবেল
আমরা স্যাট ফ্যামিলি মনে করি, প্রোগ্রামিং শেখার জন্য সি খুবই সহায়ক একটি ল্যাঙ্গুয়েজ।
আপনি যদি একেবারে নতুন হয়ে থাকেন তাহলে প্রোগ্রামিং শেখা শুরু করার জন্য ইহা খুবই ভালো ল্যাঙ্গুয়েজ। আর আপনি যদি প্রফেশনাল প্রোগ্রামার হয়ে থাকেন এবং শিডিউল যদি খুবই টাইট হয়, তাহলে আপনি আপনার অবসর সময়ে ইহা শিখতে পারেন। ইহা আপনার প্রোগ্রামিং ব্যাসিককে নিশ্চিতভাবে আরোও শক্তিশালী কর তুলবে।
এই অধ্যায়ে আপনি কীওয়ার্ড(keyword) সম্মন্ধে জানবেন। সি প্রোগ্রামিং এ কীওয়ার্ড হলো সংরক্ষিত(reserved) শব্দ যা সিনট্যাক্স(syntax)-এর অংশ।
সি প্রোগ্রামিং ভাষার সবচেয়ে ক্ষুদ্রতম একককে টোকেন(token) বলা হয়। সি প্রোগ্রামিং এ তিন ধরনের টোকেন আছে এবং সকল প্রোগ্রামেই এই টোকেন-সমূহ ব্যবহৃত হয়ঃ
সি প্রোগ্রামে ব্যবহৃত বৈধ বর্ণমালা(alphabets), অংক(digits) এবং বিশেষ অক্ষর(special characters)-এর সমাহার-ই হলো অক্ষর সেট।
বড় হাতের অক্ষর(Uppercase): A B C ................................... X Y Z
ছোট হাতের অক্ষর(Lowercase): a b c ...................................... x y z
0 1 2 3 4 5 6 7 8 9
, | < | > | . | _ |
( | ) | ; | $ | : |
% | [ | ] | # | ? |
' | & | { | } | " |
^ | ! | * | / | | |
- | \ | ~ | + |
হোয়াইট স্পেস ক্যারেক্টার(White space Characters)
খালি স্পেস(blank space), নতুন লাইন(new line), অনুভূমিক ট্যাব(horizontal tab), ক্যারিয়েজ রিটার্ন(carriage return) এবং ফর্ম ফিড( form feed)
int age;
এখানে int হলো কীওয়ার্ড যা দ্বারা 'age' কে পূর্ণসংখ্যা(integer) টাইপের ভ্যারিয়েবল(variable) হতে নির্দেশ করছে।
সি প্রোগ্রামিং কেস-সেনসিটিভ(case-sensitive) হওয়ায় সকল কীওয়ার্ডকে অবশ্যই ছোট হাতের অক্ষরে লিখতে হবে। এখানে আনসি(ANSI) সমর্থিত সকল কীওয়ার্ড এর তালিকা তুলে ধরা হলোঃ
auto | double | int | struct |
break | else | long | switch |
case | enum | register | typedef |
char | extern | return | union |
continue | for | signed | void |
do | if | static | while |
default | goto | sizeof | volatile |
const | float | short | unsigned |
এই সমস্ত কীওয়ার্ড ছাড়া কম্পাইলার(compiler) এর উপর ভিত্তিকরে সি প্রোগ্রামিং ল্যাঙ্গুয়েজ আরোও কিছু কীওয়ার্ড সমর্থন করে।
এই সমস্ত কীওয়ার্ড, এদের সিনট্যাক্স এবং এদের ব্যবহার কীওয়ার্ড সংশ্লিষ্ট টপিক্সে আলোচনা করা হয়েছে। যাইহোক, আপনি সামনে না বেড়ে সংক্ষেপে যদি এই সকল কীওয়ার্ডের ধারণা নিতে চান তাহলে সি প্রোগ্রামিং এ সকল কি কীওয়ার্ডের তালিকা পেজটি ভিজিট করতে পারেন।
এই অধ্যায়ে আপনি আইডেন্টিফায়ার(identifier) সম্মন্ধে জানবেন এবং ভ্যারিয়েবল(variable) এর জন্য উপযুক্ত নামকরণ শিখবেন |
কোনো সত্ত্বা(entity) যেমন ভ্যারিয়েবল, ফাংশন, স্ট্রাকচার ইত্যাদিকে সনাক্ত করার জন্য ব্যবহৃত নামই হলো আইডেন্টিফায়ার।
সি প্রোগ্রামিং এ আইডেন্টিফায়ারকে অবশ্যই ইউনিক(unique) হতে হবে। প্রোগ্রাম সম্পাদন(execution)-এর সময় কোনো সত্ত্বাে(entity)-কে একটি ইউনিক নামের মাধ্যমে সনাক্ত করার জন্যই মূলত এদের সৃষ্টি।
উদাহরণস্বরূপঃ
int money;
double accountBalance;
এখানে money এবং accountBalance হলো আইডেন্টিফায়ার
মনে রাখবেন, আইডেন্টিফায়ার এর নাম দেওয়ার জন্য কখনোই সি কীওয়ার্ডসমূহ ব্যবহার করা যাবে না।
যেমন- আপনি ইচ্ছা করলেই double কে আইডেন্টিফায়ার হিসাবে ব্যবহার করতে পারবেন না কারণ ইহা কীওয়ার্ড।
কীওয়ার্ড ছাড়া আইডেন্টিফায়ারের জন্য আপনি যেকোনো নাম পছন্দ করতে পারেন। যাইহোক, আপনি যদি আইডেন্টিফায়ারকে অর্থপূর্ণ নাম দেন তাহলে ইহা আপনার এবং আপনার অনুসারী প্রোগ্রামারদের জন্যও বুঝা সহজ হবে।
এই অধ্যায়ে আপনি সি প্রোগ্রামিং ভ্যারিয়েবল এবং ভ্যারিয়েবলের নামকরন পদ্ধতি সম্মন্ধে জানবেন।
প্রোগ্রামিং এ ভ্যারিয়েবল হলো তথ্য জমা রাখার পাত্র(Container) বা স্টোরেজ এরিয়া।
স্টোরেজ এরিয়াকে নির্দেশ করার জন্য প্রত্যেকটি ভ্যারিয়েবলের একটি ইউনিক নাম দিতে হয়(আইডেন্টিফায়ার)। মেমোরি লোকেশনকে নির্দেশ করার জন্য ভ্যারিয়েবল হলো একটি সাংকেতিক নাম।
উদাহরণস্বরূপঃ
int age =30;
এখানে age হলো একটি ইন্টেজার(integer) টাইপের ভ্যারিয়েবল এবং ইহাতে ভ্যালু এসাইন করা হয়েছে 32।
ভ্যারিয়েবলের ভ্যালু পরিবর্তন হতে পারে বলেই এর নাম দেওয়া হয়েছে ভ্যারিয়েবল।
সি প্রোগ্রামিং এ ব্যবহারের পূর্বেই ভ্যারিয়েবলকে ডিক্লেয়ার(declare) করতে হায়।
সি দৃঢ়ভাবে(strongly) একটি টাইপ ল্যাংগুয়েজ। অর্থাৎ প্রোগ্রাম সম্পাদনের সময় ভ্যারিয়েবলের টাইপ পরিবর্তন হয় না।
ডেটা টাইপ সম্মন্ধে আরো জানতে আমাদের ভ্যারিয়েবল ডেটা টাইপ অধ্যায় ভিজিট করুন।
এই অধ্যায়ে আপনি সি প্রোগ্রামিং কনস্ট্যান্ট(constant) এবং কনস্ট্যান্টের বিভিন্ন টাইপ সম্মন্ধে জানবেন।
কনস্ট্যান্ট হলো ভ্যালু বা আইডেন্টিফায়ার। প্রোগ্রাম সম্পাদনের সময় যার ভ্যালু পরিবর্তন হয় না। উদাহরনস্বরুপঃ "SATT Academy", 1, 2 ইত্যাদি।
তাহলে আমরা দেখলাম যে, আইডেন্টিফায়ারকে কনস্ট্যান্ট হিসাবেও ডিফাইন্ড করা যায়।
const double PI = 3.14
এখানে PI একটি কনস্ট্যান্ট যার অর্থ এই প্রোগ্রামে PI এবং 3.14 একই।
সি প্রোগ্রামিং এ ব্যবহৃত বিভিন্ন ধরণের কনস্ট্যান্ট এবং তাদের বর্ণনা নিম্নে তুলে ধরা হলোঃ
ক্যারেক্টার কনস্ট্যান্ট(character constant) হলো সিঙ্গেল ক্যারেক্টার বিশিষ্ট্য কনস্ট্যান্ট যা সিঙ্গেল কোটেশন(' ') দিয়ে ঘেরা থাকে। উদাহরনস্বরুপঃ 'a', 'M', 'T', 's' ইত্যাদি
Integer এর বাংলা অর্থ পূর্ণসংখ্যা।
ইন্টেজার কনস্ট্যান্ট(integer constant) হলো দশমিক এবং সূচক অংশ ব্যতীত গাণিতিক পূর্ণ সংখ্যা বিশিষ্ট কনস্ট্যান্ট বা ধ্রুবক। সি প্রোগ্রামিং এ তিন ধরণের ইন্টেজার কনস্ট্যান্ট রয়েছেঃ
- ডেসিমাল কনস্ট্যান্ট-decimal constant(১০ ভিত্তিক কনস্ট্যান্ট)
- অক্ট্যাল কনস্ট্যান্ট-octal constant(৮ ভিত্তিক কনস্ট্যান্ট)
- হেক্সাডেসিমাল কনস্ট্যান্ট- hexadecimal constant(১৬ ভিত্তিক কনস্ট্যান্ট)
উদাহরণস্বরূপঃ
৮ ভিত্তিক কনস্ট্যান্টঃ 070, 055, 099 ইত্যাদি
১০ ভিত্তিক কনস্ট্যান্টঃ 0, 20, 100 ইত্যাদি
১৬ ভিত্তিক কনস্ট্যান্টঃ 0x7f, 0x2a, 0x521 etc
সি প্রোগ্রামিং এ অক্ট্যাল কনস্ট্যান্ট শুরু হয় 0(zero) দিয়ে এবং হেক্সাডেসিমাল কনস্ট্যান্ট শুরু হয় 0x দিয়ে।
floating point এর বাংলা অর্থ দশমিক(.) সংখ্যা।
ফ্লোটিং পয়েন্ট কনস্ট্যান্ট(floating point constant) হলো দশমিক এবং সূচক অংশ যুক্ত গাণিতিক কনস্ট্যান্ট।
10.05
0.03487
-0.15E-4
নোটঃ E-4 = 10-4
মাঝে মাঝে এমন কিছু ক্যারেক্টার ব্যবহার করতে হয় যেগুলো টাইপ করা যাইনা অথবা সি প্রোগ্রামিং এ বিশেষ অর্থ বহন করে। যেমন- backspace, tab, backslash ইত্যাদি। এগুলো ব্যবহার করতে হলে স্কেইপ সিকুয়েন্স(escape sequence) ব্যবহার করতে হয়।
উদাহরণস্বরূপঃ নতুন লাইন(Newline) এর জন্য \n
ব্যবহৃত হয়। ব্যাকস্পেস(Backspace) এর জন্য \b
ব্যবহৃত হয়।
স্কেইপ সিকুয়েন্স | নাম |
---|---|
\b | Backspace |
\f | Form feed |
\n | Newline |
\r | Return |
\t | Horizontal tab |
\v | Vertical tab |
\\ | Backslash |
\' | Single quotation mark |
\" | Double quotation mark |
\? | Question mark |
\0 | Null character |
স্ট্রিং কনস্ট্যান্ট(String constant) হলো কনস্ট্যান্ট যা ডাবল কোটেশন(" ") দিয়ে ঘেরা থাকে। উদাহরনস্বরুপঃ
"" //null স্ট্রিং কনস্ট্যান্ট
"SATT" //স্ট্রিং কনস্ট্যান্ট
" " //৫ টি ফাঁকা স্পেস বিশিষ্ট স্ট্রিং কনস্ট্যান্ট
"t" //সিঙ্গেল ক্যারেক্টার বিশিষ্ট স্ট্রিং কনস্ট্যান্ট
"Love is heaven\n" //একটি নতুন লাইনসহ স্ট্রিং প্রিন্ট করবে
enum কীওয়ার্ড দিয়ে ইনিউমিরেশন টাইপ ডিফাইন্ড( defined) করা হয়। উদাহরণস্বরূপঃ
enum color {teal, green, orange, white};
এখানে color একটি ভ্যারিয়েবল এবং purple, green, black ও white হলো ইনিউমিরেশন কনস্ট্যান্ট(Enumeration constants) যাদের ভ্যালু যথাক্রমে 0, 1, 2 এবং 3 । ইনিউমিরেশন সম্মন্ধে আরো জানতে আমাদের সি ইনুমিরেশন অধ্যায় ভিজিট করুন।
সি প্রোগ্রামে কনস্ট্যান্ট ডিফাইন করার জন্য দুটি সাধারণ পদ্ধতি রয়েছে।
- const কীওয়ার্ড ব্যবহার করে
- #define প্রিপ্রোসেসর ব্যবহার করে
একটি নির্দিষ্ট টাইপের কনস্ট্যান্ট ডিক্লেয়ার করার জন্য আপনি const কীওয়ার্ডকে প্রিফিক্স(prefix) হিসাবে ব্যবহার করতে পারেন।
const type variable = value;
kt_satt_skill_example_id=30
উপরের প্রোগ্রামটি যখন কম্পাইল এবং এক্সিকিউট করা হবে তখন ইহা নিচের মত আউটপুট দেখাবেঃ
আপনি #define প্রিপ্রোসেসর ব্যবহার করেও কনস্ট্যান্ট ডিফাইন(define) করতে পারেন।
#define identifier value
kt_satt_skill_example_id=33
উপরের প্রোগ্রামটি যখন কম্পাইল এবং এক্সিকিউট করা হবে তখন ইহা নিচের মত আউটপুট দেখাবেঃ
এই অধ্যায়ে আপনি সি প্রোগ্রামিং ডেটা টাইপ(data type) এবং ভ্যারিয়েবল ডিক্লেয়ারেশন(declaration) পদ্ধতি সম্মন্ধে জানবেন।
ডেটা টাইপ দ্বারা ভ্যারিয়েবলের মধ্যে সংরক্ষিত ডেটার টাইপ নির্ধারণ করা হয়।
সি প্রোগ্রামিং এ ভ্যারিয়েবল বা মেমোরি লোকেশন(location)-কে ব্যবহারের পূর্বে ডিক্লেয়ার করতে হয়। একইভাবে ফাংশনকেও ব্যবহারের পূর্বেই ডিক্লেয়ার(declare) করতে হয়।
ডেটা টাইপ যুক্ত ভ্যারিয়েবল এবং ফাংশন ডিক্লেয়ারেশন দ্বারা সাধারণত ডেটার সাইজ এবং টাইপ নির্ধারণ করা হয়।
এই অধ্যায়ে আমরা মৌলিক ডেটা টাইপের প্রতি বেশী নজর দিয়েছি। আপনি ডিরাইভ ডেটা টাইপ সম্মন্ধে জানতে আমাদের ডিরাইভ(Derived) ডেটা টাইপ সম্পর্কিত অধ্যায় ভিজিট করুন।
ক্যারেক্টার টাইপের ভ্যারিয়েবল ডিক্লেয়ার করার জন্য char কীওয়ার্ড ব্যবহৃত হয়। উদাহরণস্বরূপঃ
char alphabet = 'a'
এখানে alphabet হলো ক্যারেক্টার ভ্যারিয়েবল এবং alphabet এর ভ্যালু 'a'।
ক্যারেক্টার ভ্যারিয়েবলের সাইজ 1 বাইট।
দশমিক(.) সংখ্যা ব্যতীত সকল ধনাত্মক এবং ঋণাত্মক পূর্ণ সংখ্যা এই টাইপের মধ্যে পড়ে। যেমন- 0, -10, 10 ইত্যাদি
সি প্রোগ্রামিং এ ইন্টেজার টাইপের ভ্যারিয়েবল ডিক্লেয়ার করার জন্য int কীওয়ার্ড ব্যবহৃত হয়। উদাহরণস্বরূপঃ
int roll_no;
এখানে roll_no হলো ইন্টেজার টাইপের ভ্যারিয়েবল।
সি প্রোগ্রামিং এ আপনি একটি ডিক্লেয়ারেশনের মাধ্যমে অনেক ভ্যারিয়েবলকে একই সঙ্গে ডিক্লেয়ার করতে পারেন। উদাহরনস্বরুপঃ
int roll_no, age, years;
int এর সাইজ 2 বাইট(পুরাতন কম্পিউটারে) অথবা 4 বাইট হতে পারে। আপনার ভ্যারিয়েবলের সাইজ যদি 4 বাইট হয় তাহলে ইহা 232 সংখ্যক স্বতন্ত্র ভ্যালু গ্রহণ করতে পারে। যেমন- -231,-231+1, ...,-2, -1, 0, 1, 2, ..., 231-2, 231-1
একইভাবে int ভ্যারিয়েবলের সাইজ 2 বাইট হলে ইহা -215 থেকে 215-1 এর মধ্যে 216 সংখ্যক বিভিন্ন ভ্যালু গ্রহণ করতে পারে। আপনি যদি 231-1 অর্থাৎ +2147483647 থেকে বড় নাম্বার এবং -231 অর্থাৎ -2147483648 থেকে ছোট নাবার স্টোর(store) করতে চান তাহলে প্রোগ্রাম ঠিকমত রান(run) করবে না।
ফ্লোটিং টাইপ ভ্যারিয়েবলে যেকোনো বাস্তব সংখ্যা থাকতে পারে। যেমন- 3.1416, -5.382, 10.0 ইত্যাদি। ফ্লোট টাইপের ভ্যারিয়েবল ডিক্লেয়ার(declare) করার জন্য আপনি হয় float
অথবা double
কীওয়ার্ড ব্যবহার করতে পারেন। উদাহরনস্বরুপঃ
float accountBalance;
double bookPrice;
এখানে accountBalance এবং bookPrice উভয়েই ফ্লোটিং টাইপ ভ্যারিয়েবল।
সি প্রোগ্রামিং এ ফ্লোটিং ভ্যালুকে এক্সপনেনশিয়াল(exponential) ফর্মেও উপস্থাপন করা যায়। উদাহরনস্বরুপঃ
float normalizationFactor = 22.442e2;
float টাইপ | double টাইপ |
---|---|
ফ্লোট(float) ভ্যারিয়েবলের সাইজ ৪ বাইট | ডাবল(double) ভ্যারিয়েবলের এর সাইজ ৮ বাইট |
সিঙ্গেল প্রিসিশন(single precision) এর ক্ষেত্রে ফ্লোট ডেটা টাইপ ব্যবহৃত হয় | ডাবল প্রিসিশন(double precision) এর ক্ষেত্রে double ডেটা টাইপ ব্যবহৃত হয়। |
ফ্লোটিং পয়েন্ট ভ্যারিয়েবলের প্রিসিশন ৬ ডিজিট | ডাবলের প্রিসিশান ১৪ ডিজিট। |
চলুন এক নজরে ডেটা টাইপসমূহ দেখে নিই। এখানে ৩২ বিট আর্কিটেকচারের উপর ভিত্তিকরে ডেটার সাইজ দেওয়া হোল।
ডেটা টাইপ | মেমোরি সাইজ | রেঞ্জ |
---|---|---|
char | 1 বাইট | −128 থেকে 127 |
signed char | 1 বাইট | −128 থেকে 127 |
unsigned char | 1 বাইট | 0 থেকে 255 |
short | 2 বাইট | −32,768 থেকে 32,767 |
signed short | 2 বাইট | −32,768 থেকে 32,767 |
unsigned short | 2 বাইট | 0 থেকে 65,535 |
int | 2 বাইট | −32,768 থেকে 32,767 |
signed int | 2 বাইট | −32,768 থেকে 32,767 |
unsigned int | 2 বাইট | 0 থেকে 65,535 |
short int | 2 বাইট | −32,768 থেকে 32,767 |
signed short int | 2 বাইট | −32,768 থেকে 32,767 |
unsigned short int | 2 বাইট | 0 থেকে 65,535 |
long int | 4 বাইট | -2,147,483,648 থেকে 2,147,483,647 |
signed long int | 4 বাইট | -2,147,483,648 থেকে 2,147,483,647 |
unsigned long int | 4 বাইট | 0 থেকে 4,294,967,295 |
float | 4 বাইট | |
double | 8 বাইট | |
long double | 10 বাইট |
মোডিফায়ার(modifiers) মৌলিক ডেটা টাইপের অর্থ পরিবর্তন করে নতুন ডেটা টাইপ উৎপন্ন করে।
সাইজ মোডিফায়ার মৌলিক ডেটা টাইপের সাইজ পরিবর্তন করতে পারে। সি প্রোগ্রামিং এ দুই ধরনের সাইজ মোডিফায়ার আছেঃ
- short
- long
নিম্নে সাইজ মোডিফায়ারের উদাহরণ দেখানো হলো:
long double i;
ডাবল(double) এর সাইজ ৮ বাইট। এর সাথে long কীওয়ার্ড ব্যবহার করলে ভ্যারিয়েবলের সাইজ হয়ে যায় ১০ বাইট।
আপনি যদি মনে করেন ভ্যারিয়েবলের ভ্যালু খুব বড় হওয়ার প্রয়োজন নাই তাহলে short কীওয়ার্ড ব্যবহার করতে পারেন। উদাহরণস্বরূপঃ
short int a; // সকল অপারেটিং সিস্টেমের জন্য 2 bytes মেমোরি স্পেস দখল করে।
ইন্টেজার এবং ফ্লোটিং পয়েন্ট ভ্যারিয়েবল উভয়েই ধনাত্মক এবং ঋণাত্মক মান গ্রহণ করতে পারে। যাইহোক, ভ্যারিয়েবলের ভ্যালু যদি শুধুমাত্র ধনাত্মক রাখতে চান তাহলে unsigned ডেটা টাইপ ব্যবহার করতে হবে।
//unsigned ভ্যারিয়েবলের ঋণাত্মক মান থাকতে পারবে না
unsigned int positiveInteger;
এছাড়া অন্য একটি মোডিফায়ার signed রয়েছে যার ধনাত্মক এবং ঋণাত্মক উভয় ভ্যালুই থাকতে পারে। কিন্তু ইহা ডিফাইন্ড করার কোনো প্রয়োজন নাই কারণ ভ্যারিয়েবল ডিফল্টভাবেই signed থাকে।
4 বাইটের একটি ইন্টেজার ভ্যারিয়বলের -231 থেকে 231-1 পর্যন্ত ভ্যালু থাকতে পারে। কিন্তু ভ্যারিয়েবলকে যদি unsigned হিসাবে ডিফাইন্ড করা হয় তাহলে ইহার 0 থেকে 232-1 পর্যন্ত ভ্যালু থাকতে পারে।
মনে রাখবেন, সাইন মোডিফায়ার শুধুমাত্র int এবং char ডেটা টাইপের ক্ষেত্রে প্রযোজ্য।
আইডেন্টিফায়ারকে কনস্ট্যান্ট হিসাবেও ডিক্লেয়ার করা যায়। ইহার জন্য const কীওয়ার্ড ব্যবহৃত হয়।
const int age = 32;
প্রোগ্রামে age ভ্যারিয়েবলের ভ্যালু পরিবর্তন হবে না।
প্রোগ্রামের বাহিরের কোনো এক্সটার্নাল সোর্সের মাধ্যমে ভ্যারিয়েবলের ভ্যালু পরিবর্তন করতে হলে ভ্যারিয়েবলকে volatile হিসাবে ডিক্লেয়ার করা উচিৎ।
এই অধ্যায়ে আমরা সি প্রোগ্রামিং এর দুটি বিল্ট-ইন(built-in) ফাংশন printf() এবং scanf() কে বেশী ফোকাস করবো যা ইনপুট এবং আউটপুট কার্য সম্পাদনের জন্য ব্যবহৃত হয়। এছাড়া এই অধ্যায়ে আপনি বৈধ সি প্রোগ্রাম লেখাও শিখবেন।
ইনপুট এবং আউটপুট কার্যাবলী সম্পাদনের জন্য সি প্রোগ্রামিং এ কিছু বিল্ট-ইন লাইব্রেরী ফাংশন রয়েছে।
সি প্রোগ্রামিং ইনপুট-আউটপুট( I/O) এর জন্য সবচেয়ে বেশী ব্যবহৃত দুটি ফাংশন হলো printf() এবং scanf()।
স্টান্ডার্ড ইনপুট ডিভাইস(কীবোর্ড) এর মাধ্যমে ইউজার থেকে formated ইনপুট নেওয়ার জন্য scanf()
ফাংশন ব্যবহৃত হয়। পক্ষান্তরে স্টান্ডার্ড আউটপুট ডিভাইস(স্ক্রিন) এ formated আউটপুট পাঠানোর জন্য printf()
ফাংশন ব্যবহৃত হয়।
scanf("%c", &var_name); // Character ইনপুট নেওয়ার জন্য
scanf("%d", &var_name); // integer ইনপুট নেওয়ার জন্য
scanf("%f", &var_name); // float ইনপুট নেওয়া হয়
scanf("%lf", &var_name); // double ইনপুট নেওয়া হয়
scanf("%s", &var_name); // string ইনপুট নেওয়া হয়
printf("%c", &var_name); // Character এ আউটপুট পাওয়ার জন্য
printf("%d", &var_name); // integer এ আউটপুট পাওয়ার জন্য
printf("%f", &var_name); // float এ আউটপুট পাওয়ার জন্য
printf("%lf", &var_name); // double এ আউটপুট পাওয়ার জন্য
printf("%s", &var_name); // string এ আউটপুট পাওয়ার জন্য
kt_satt_skill_example_id=97
আউটপুট
প্রোগ্রাম কিভাবে কাজ করে তার ব্যাখ্যা নিচে ধাপে ধাপে দেওয়া হলোঃ
main()
ফাংশন থাকতে হবে। main()
ফাংশনের প্রথম থেকে কোড এক্সিকিউশন(execution) শুরু হয়।printf()
হলো লাইব্রেরী ফাংশন যা স্ক্রিনে ফরম্যাটেড(formated) আউটপুট পাঠায়। "stdio.h"
হেডার ফাইলে printf()
ফাংশন ডিক্লেয়ার করা আছে।stdio.h
হলো স্টান্ডার্ড ইনপুট-আউটপুট হেডার(header) ফাইল এবং #include
হলো প্রিপ্রোসেসর(preprocessor) যা হেডার ফাইলকে সোর্স কোডের সংযুক্ত করে। কম্পাইলার যখন printf()
ফাংশনকে এক্সিকিউট করে এবং stdio.h
হেডার ফাইলকে খুঁজে না পাই তাহলে কম্পাইলার error দেখায়।return 0;
স্টেটমেন্ট এর মাধ্যমে প্রোগ্রাম থেকে বের হয়ে যায়। সহজ ভাষায় প্রোগ্রামের সমাপ্তি ঘটায়।kt_satt_skill_example_id=85
ফরম্যাটেড ক্যারেক্টার ইনপুট গ্রহণ এবং আউটপুট পাঠানোর জন্য "%c" ফরম্যাট স্ট্রিং ব্যবহৃত হয়।
kt_satt_skill_example_id=87
printf()
ফাংশনের কোটেশন মার্কের মধ্যে ইন্টেজারের জন্য ফরম্যাটেড(formated) স্ট্রিং "%d"
রয়েছে। এক্ষেত্রে ফরম্যাট স্ট্রিং যদি integerNumber আর্গুমেন্টের সাথে মিলে যায় তাহলে ইহা স্ক্রিনে আউটপুট দেখায়।
kt_satt_skill_example_id=89
scanf()
ফাংশন কীবোর্ড থেকে ফরম্যাটেড(formated) ইনপুট গ্রহণ করে। যখন ইউজার ইন্টেজার নাম্বার ইনপুট দেয় তখন ইহা IntegerNumber ভ্যারিয়েবলের মধ্যে সংরক্ষিত হয়।
লক্ষ্য করলে দেখবেন যে, IntegerNumber এর পুর্বে '&'
চিহ্ন আছে। &IntegerNumber দ্বারা IntegerNumber এর এড্রেসকে নির্দেশ(point) করে এবং ইনপুট ভ্যালু ঐ এড্রেসে জমা হয়।
kt_satt_skill_example_id=92
ফ্লোটের জন্য ফরম্যাটেড ইনপুট গ্রহণ এবং আউটপুট পাঠানোর জন্য "%f" ফরম্যাট স্ট্রিং ব্যবহৃত হয়
উপরের প্রোগ্রামে যখন কোনো ক্যারেক্টার প্রবেশ করানো হয়, ক্যারেক্টার তার নিজের ফরম্যাটে সংরক্ষিত হয় না। বরং সংখ্যা ভ্যালু(আসকি ভ্যালু) ফরম্যাটে সংরক্ষিত হয়।
যখন আমরা "%c"
টেক্সট ফরম্যাট ব্যবহারা করে প্রিন্ট নিই তখন ইহা স্ক্রিনে ক্যারেক্টার ফরম্যাটে দেখায়।
kt_satt_skill_example_id=93
ক্যারেক্টার 'b' এর ASCII ভ্যালু হলো 96। যখন 'b' প্রবেশ করানো হয় তখন character ভ্যারিয়েবলে 'b' এর পরিবর্তে 96 জমা হয়।
আপনি যদি কোনো ক্যারেক্টারের আসকি কোড জানেন তাহলে ক্যারেক্টার হিসাবে আউটপুট নিতে পারবেন। নিচের উদাহরণে ইহা দেখানো হলোঃ
kt_satt_skill_example_id=94
এরিথমেটিক(arithmetic), কন্ডিশনাল(conditional) এবং বিটওয়াজ(bitwise) অপারেশন সম্পন্ন করার জন্য সি প্রোগ্রামিং এ অনেক ধরণের অপারেটর(oparetor) রয়েছে। এই অধ্যায়ে আপনি বিভিন্ন ধরণের সি অপারেটর এবং এদের ব্যবহার সম্মন্ধে জানবেন।
অপারেটর এক ধরণের প্রতীক(symbol) যা ভ্যালু(value) অথবা ভ্যারিয়েবলকে অপারেট করতে পারে। উদাহরণস্বরূপঃ +(যোগ চিহ্ন) একটি অপারেটর যা যোগের কাজে ব্যবহৃত হয়।
বিভিন্ন ধরণের অপারেশন সম্পাদনের জন্য সি প্রোগ্রামিং এ অনেক ধরণের অপারেটর রয়েছে। ভালভাবে বুঝার জন্য অপারেটরসমূহকে নিম্নোক্ত উপায়ে বিভক্ত করা যায়ঃ
এরিথমেটিক অপারেটর গাণিতিক হিসাব নিকাশ যেমন- যোগ, বিয়োগ, গুন এবং ভাগ ইত্যাদি কার্য সম্পন্ন করে।
অপারেটর | অপারেটেরের অর্থ | উদাহরণ(int a=11, b=5) | ফলাফল |
---|---|---|---|
+ | যোগ বা ইউনারী(unary) যোগ | a + b | 16 |
- | বিয়োগ বা ইউনারী বিয়োগ | a - b | 6 |
* | গুন | a * b | 55 |
/ | ভাগ | a / b | 2 |
% | ভাগের পরে ফলাফল ভাগশেষ(মডিউলো অপারেটর) | a % b | 1 |
kt_satt_skill_example_id=115
+, - এবং * অপারেটর সঠিকভাবে যথাক্রমে যোগ, বিয়োগ এবং গুন করে।
সাধারনভাবে আপনি যদি 11 কে 5 (11/5
)দিয় ভাগ করেন তাহলে ভাগফল পাবেন 2.2। কিন্তু আমাদের প্রোগ্রামের আউটপুট 2 পাওয়া গেছে।
কারণ উভয় ভ্যারিয়েবলের টাইপ ইন্টেজার। তাই আউটপুটও ইন্টেজার হয়েছে। কম্পাইলার দশমিক সংখ্যার দশমিকের পরের অংশকে কেটে ফেলেছে ফলে ফলাফল 2.2 এর পরিবর্তে 2 হয়েছে।
মডিউলো অপারেটর % এর মাধ্যমে ভাগশেষ পাওয়া যায়। উপরের উদাহরণে a = 11
কে b = 5
দিয়ে ভাগ করায় ভাগশেষ 1 পাওয়া গেছে। শুধুমাত্র ইন্টেজারের ক্ষেত্রেই % অপারেটর ব্যবহৃত হয়।
ধরুন a = 10.0, b = 4.0, c = 10 এবং d = 4 তাহলে সি প্রোগ্রামিং a/b = 2.5 //কারণ উভয় অপারেন্ড ফ্লোটিং পয়েন্ট ভ্যারিয়েবল। a/d = 2.5 //কারণ একটি অপারেন্ড ফ্লোটিং পয়েন্ট ভ্যারিয়েবল। c/b = 2.5 //কারণ একটি অপারেন্ড ফ্লোটিং পয়েন্ট ভ্যারিয়েবল। c/d = 2 // কারণ উভয় অপারেন্ড ইন্টেজার ভ্যারিয়েবল।
কনস্ট্যান্ট অথবা ভ্যারিয়েবলের অপারেন্ডেকে ১ করে বৃদ্ধি বা হ্রাসের জন্য সি প্রোগ্রামিং এ যথাক্রমে দুটি অপারেটর আছে একটি হলো ইনক্রিমেন্ট(increment) ++ এবং অপরটি হলো ডিক্রিমেন্ট(decrement) --।
ইনক্রিমেন্ট অপারেটর ভ্যারিয়েবলের ভ্যালু এক করে বৃদ্ধি করে পক্ষান্তরে ডিক্রিমেন্ট অপারেটর ভ্যালু এক করে হ্রাস করে। এই দুটি অপারেটরকে ইউনারী(unary) অপারেটর বলা হয় কারণ এরা সিঙ্গেল অপারেন্ডকে অপারেট করতে পারে।
kt_satt_skill_example_id=99
এখানে অপারেটর ++ এবং -- প্রিফিক্স(prefix) হিসাবে ব্যবহৃত হয়েছে। এই অপারেটর দুটি পোস্টফিক্স(postfix) হিসাবেও ব্যবহৃত হতে পারে। যেমন- a++
এবং a--
। ইনক্রিমেন্ট এবং ডিক্রিমেন্ট অপারেটর সম্বন্ধে আরোও জানতে সি প্রোগ্রামে ইনক্রিমেন্ট এবং ডিক্রিমেন্ট অপারেটর অধ্যায় ভিজিট করুন।
ভ্যারিয়েবলে ভ্যালু এসাইন করা বা জমা রাখার জন্য এসাইনমেন্ট(assignment) অপারেটর ব্যবহৃত হয়। সবচেয়ে বেশী ব্যবহৃত এসাইনমেন্ট অপারেটর হলো =
অপারেটর | উদাহরন(int a=11, b=5) | একই রকম | ফলাফল |
---|---|---|---|
= | a = b | a = b | 5 |
+= | a += b | a = a+b | 16 |
-= | a -= b | a = a-b | 6 |
*= | a *= b | a = a*b | 55 |
/= | a /= b | a = a/b | 2 |
%= | a %= b | a = a%b | 1 |
kt_satt_skill_example_id=100
সি প্রোগ্রামিং এ রিলেশনাল অপারেটর(relational operator) দুটি অপারেন্ডের মধ্যে সম্পর্ক যাচাই করে। রিলেশন সত্যি(true) হলে 1 রিটার্ন করে; রিলেশন মিথ্যা(false) হলে 0 রিটার্ন করে।
সিদ্ধান্ত গ্রহণ(decision making) এবং লুপ(loop) এ রিলেশনাল অপারেটর ব্যবহৃত হয়।
অপারেটর | অপারেটরের অর্থ | উদাহরণ(int a=11, b=5) | ফলাফল |
---|---|---|---|
== | Equal to | a == b | False |
> | Greater than | a > b | True |
< | Less than | a < b | False |
!= | Not equal to | a != b | True |
>= | Greater than or equal to | a >= b | True |
<= | Less than or equal to | a <= b | False |
kt_satt_skill_example_id=101
সি প্রোগ্রামিং এ &&, || এবং ! অপারেটরসমূহকে লজিক্যাল(Logial) অপারেটর বলা হয়। সি প্রোগ্রামিং এ সিদ্ধান্ত গ্রহণে(in decision making ) সচারচর লজিক্যাল অপারেটর ব্যবহৃত হয়।
অপারেটর | অপারেটরের অর্থ | উদাহরণ(int a=11, b=5, c =15) | ফলাফল |
---|---|---|---|
&& | Logial AND - উভয় অপারেন্ড true হলে True | (a==b) && (b>c) | True |
|| | Logical OR - যেকোনো একটি অপারেন্ড true হলে True | (b==c) || (a>c) | False |
! | Logical NOT - অপারেন্ড false হলে True | !(b==c) | True |
kt_satt_skill_example_id=103
উপরের উদাহরণের ব্যাখ্যা
(a = b)
এবং (c > b)
উভয় অপারেন্ড true হওয়ায় (a = b) && (c > 5)
এর ফলাফল 1 হয়েছে।(c < b)
এর ভ্যালু false হওয়ায় (a = b) && (c < b)
এর ফলাফল 0 হয়েছে।(a = b)
এর ভ্যালু true হওয়ায় (a = b) || (c < b)
এর ফলাফল 1 হয়েছে।(a != b)
এবং (c < b)
উভয় অপারেন্ড false হওয়ায় (a != b) || (c < b)
এর ফলাফল 0 হয়েছে।(a != b)
এর ভ্যালু false হওয়ায় !(a != b)
এর ফলাফল 1 হয়েছে। কারণ !(a != b) এর ভ্যালু true।(a == b)
এর ভ্যালু true হওয়ায় !(a == b)
এর ফলাফল 0 হয়েছে। কারণ !(a == b)
এর ভ্যালু false।হিসাব নিকাশের সময় গাণিতিক অপারেশন যেমন- যোগ, বিয়োগ, গুণ এবং ভাগ বিট-লেভেলে রূপান্তরিত হলে দ্রুত প্রোসেসিং হয় এবং শক্তি(power) সংরক্ষিত হয়।
সি প্রোগ্রামিং এ বিট-লেভেল অপারেশন সম্পন্ন করার জন্য বিটওয়াইজ(Bitwise) অপারেটর ব্যবহৃত হয়।
মনেকরি, নিচের টেবিলে x = 10 (বাইনারিতে 0000 1010) এবং y = 4 (বাইনারিতে 0000 0100)
অপারেটর | অপারেটরের অর্থ | উদাহরণ(x=10 এবং y=4) | ফলাফল |
---|---|---|---|
& | Bitwise AND | x& y = 0 (0000 0000) | 0 |
| | Bitwise OR | x | y = 14 (0000 1110) | 14 |
^ | Bitwise exclusive OR | x ^ y = 14 (0000 1110) | 14 |
~ | Bitwise complement | ~x = -11 (1111 0101) | -11 |
<< | Shift left | x<< 2 = 42 (0010 1000) | 42 |
>> | Shift right | x>> 2 = 2 (0000 0010) | 2 |
বিটওয়াইজ অপারেটর সম্মন্ধে আরোও জানতে আমাদের সি বিটওয়াইজ অপারেটর অধ্যায় ভিজিট করুন
সম্পর্কযুক্ত এক্সপ্রেশনসমূহকে একইসঙ্গে ডিক্লেয়ার(declare) করার জন্য কমা(comma) অপারেটর ব্যবহৃত হয়। উদাহরনস্বরুপঃ
int a, b = 10, c = 5, d;
sizeof
অপারেটর হলো ইউনারী অপারেটর যা ডেটা যেমন- কনস্ট্যান্ট, ভ্যারিয়েবল, অ্যারে, স্ট্রাকচার ইত্যাদির সাইজ রিটার্ন করে
sizeof(variable)
যখন কোনো অপারেটর তিনটি অপারেন্ড(oparend) নিয়ে কাজ করে তাকে টারনারী(ternary) অপারেটর বলে। টারনারী অপারেটর দেখতে ?:
এমন। টারনারী অপারেটরকে কন্ডিশনাল অপারেটরও বলা হয়।
কন্ডিশনাল অপারেটরের কাজের ধাপ নিম্নে বর্ণনা করা হলোঃ
উপরের সিনট্যাক্সে বুলিয়ান এক্সপ্রেশন হলো কন্ডিশন এবং true part ও false part হয় ভ্যালু অথবা ভ্যারিয়েবল অথবা স্টেটমেন্ট অথবা যেকোনো গাণিতিক এক্সপ্রেশন হতে পারে। কন্ডিশন True হলে True part সম্পাদিত হয় অন্যথায় false part সম্পাদিত হয়।
kt_satt_skill_example_id=106
অন্যান্য অপারেটর যেমন- রেফারেন্স(reference) অপারেটর(&), ডিরেফারেন্স(dereference) অপারেটর(*) এবং মেম্বার(member) সিলেকশন অপারেটর (->) সি পয়েন্টার অধ্যায়ে আলোচনা করা হয়েছে।
সি প্রোগ্রামে দুই ধরনের কমেন্ট ব্যবহৃত হয়। এই অধ্যায়ে আপনি সি প্রোগ্রামে কমেন্টের ব্যবহার করা শিখবেন।
কোড ব্যাখ্যা করার জন্য এবং অধিক পাঠযোগ্য করে তোলার জন্য সি প্রোগ্রামিং এ কমেন্ট ব্যবহার করা হয়।
বিশেষকরে কোডের ডকুমেন্ট লেখার জন্য ব্যপকহারে কমেন্ট ব্যবহৃত হয়।
সি প্রোগ্রামে দুই ধরনের কমেন্ট রয়েছেঃ
- এক লাইনের কমেন্ট(Single Line Comments )
- একের অধিক লাইনের কমেন্ট(Multi Line Comments )
এক লাইনের কমেন্ট // দিয়ে শুরু হয়।
// এর পরে যেকোন ধরণের টেক্সটকে সি কম্পাইলার এড়িয়ে চলে।
উদাহরনঃ নিচের উদাহরণে সি প্রোগ্রামে কমেন্টের ব্যবহার দেখানো হলোঃ
kt_satt_skill_example_id=135
এমনকি আপনি স্টেটমেন্টের পরেও কমেন্ট রাখতে পারেন।
printf("I Love C"); //প্রিন্ট ফাংশনের ব্যবহার
একের অধিক লাইনের কমেন্ট /* দিয়ে শুরু হয় এবং */ দিয়ে শেষ হয়।
/* এবং */ এর মধ্যে যেকোন ধরণের টেক্সটকে সি কম্পাইলার এড়িয়ে চলে।
উদাহরনঃ নিচের উদাহরণে কোড বুঝার জন্য একের অধিক লাইনের কমেন্ট ব্যবহার করা হয়েছে:
kt_satt_skill_example_id=136
এই অধ্যায়ে আপনি অপারেটরসমূহের ক্রম সম্মন্ধে জানবেন। সি প্রোগ্রামে অপারেটরসমূহ পূর্ব নির্ধারিত ক্রম অনুসারে কাজ করে।
অপারেটর অগ্রাধিকার(precedence) সি প্রোগ্রামে কোন অপারেটর আগে এবং কোন অপারেটর পরে কাজ করবে সেই ক্রম নির্দেশ করে। এসোসিয়েটিভিটি(associativity) অপারেটরসমূহ নির্ণয়ের দিক নির্দেশ করে। ইহা বাম থেকে ডানে অথবা ডান থেকে বামে হতে পারে।
চলুন নিচের উদাহরণের সাহায্যে অপারেটর অগ্রাধিকার(precedence) বুঝার চেষ্টা করিঃ
int count=20+20*10;
এখানে count ভ্যারিয়েবলের ভ্যালু 220 কারণ
count = গুণন অপারেটর(20*10) আগে নির্ণয় হয় + যোগ অপারেটর
সি প্রোগ্রামিং এ প্রিসিডেন্স(precedence) এবং এসোসিয়েটিভিটি(associativity) নিম্নের টেবিলে তুলে ধরা হলোঃ
ক্যাটাগরি | অপারেটর | এসোসিয়েটিভিটি |
---|---|---|
Postfix | () [] -> . ++ - - | বাম থেকে ডানে |
Unary | + - ! ~ ++ - - (type)* & sizeof | ডান থেকে বামে |
Multiplicative | * / % | বাম থেকে ডানে |
Additive | + - | বাম থেকে ডানে |
Shift | << >> | বাম থেকে ডানে |
Relational | < <= > >= | বাম থেকে ডানে |
Equality | == != | বাম থেকে ডানে |
Bitwise AND | & | বাম থেকে ডানে |
Bitwise XOR | ^ | বাম থেকে ডানে |
Bitwise OR | | | বাম থেকে ডানে |
Logical AND | && | বাম থেকে ডানে |
Logical OR | || | বাম থেকে ডানে |
Conditional | ?: | ডান থেকে বামে |
Assignment | = += -= *= /= %=>>= <<= &= ^= |= | ডান থেকে বামে |
Comma | , | বাম থেকে ডানে |
এই অধ্যায়ে আপনি সি প্রোগ্রামিং এ সকল বিটিওয়াজ অপারেটর(Bitwise Operator) সম্বন্ধে জানবেন
সেন্ট্রাল প্রোসেসিং ইউনিট(CPU) এর মধ্যে এরেথম্যাটিক লজিক ইউনিট(ALU) এ সকল গাণিতিক ক্রিয়াকলাপ যেমন- যোগ-বিয়োগ, গুণ-ভাগ ইত্যাদি বিট-লেভেলে সম্পন্ন হয়। এই বিট-লেভেল(bit-level) অপারেশন সম্পন্ন করার কাজেই বিটওয়াইজ অপারেটর ব্যবহৃত হয়।
মনেকরি, নিচের টেবিলে x = 10 (বাইনারিতে 0000 1010) এবং y = 4 (বাইনারিতে 0000 0100)
অপারেটর | অপারেটরের অর্থ | উদাহরণ(x=10 এবং y=4) | ফলাফল |
---|---|---|---|
& | Bitwise AND | x& y = 0 (0000 0000) | 0 |
| | Bitwise OR | x | y = 14 (0000 1110) | 14 |
^ | Bitwise exclusive OR | x ^ y = 14 (0000 1110) | 14 |
~ | Bitwise complement | ~x = -11 (1111 0101) | -11 |
<< | Shift left | x<< 2 = 42 (0010 1000) | 42 |
>> | Shift right | x>> 2 = 2 (0000 0010) | 2 |
বিটওয়াইজ অপারেটরের দুটি অপারেন্ডের বিট যদি 1 হয় তাহলে বিটওয়াইজ AND অপারেটর এর আউটপুট 1 হবে।
কিন্তু যদি বিটওয়াইজ অপারেটর এর যেকোনো একটি অপারেন্ড 0(শূন্য) হয় তাহলে আউটপুট 0(শূন্য) হবে।
বিটওয়াইজ AND(&) অপারেটর এর গাণিতিক ব্যাখ্যা
10 = 0000 1010 (বাইনারিতে)
4 = 0000 0100 (বাইনারিতে)
10 এবং 4 এর বিট অপারেশন
0000 1010
& 0000 0100
________
0000 0000 = 0 (দশকমিকে)
kt_satt_skill_example_id=993
বিটওয়াইজ অপারেটরের দুটি অপারেন্ডের যেকোনো একটির বিট যদি 1 হয় তাহলে বিটওয়াইজ OR অপারেটর এর আউটপুট 1 হবে।
কিন্তু যদি বিটওয়াইজ অপারেটর এর দুটি অপারেন্ড-ই 0(শূন্য) হয় তাহলে আউটপুট 0(শূন্য) হবে। সি প্রোগ্রামিং এ | কে বিটওয়াইজ OR অপারেটর বলা হয়।
বিটওয়াইজ OR(|) অপারেটর এর গাণিতিক ব্যাখ্যা
10 = 0000 1010 (বাইনারিতে)
4 = 0000 0100 (বাইনারিতে)
10 এবং 4 এর বিট অপারেশন
0000 1010
| 0000 0100
________
0000 1110 = 14 (দশকমিকে)
kt_satt_skill_example_id=994
XOR এর পূর্ণরুপ হলো exclusive OR । বিটওয়াইজ অপারেটর এর দুটি অপারেন্ড যদি পরস্পর বিপরীত হয় তাহলে বিটওয়াইজ XOR অপারেটর এর আউটপুট 1 হবে।
কিন্তু যদি বিটওয়াইজ অপারেটর এর দুটি অপারেন্ড-ই একই রকম হয় তাহলে আউটপুট 0(শূন্য) হবে। সি প্রোগ্রামিং এ ^ কে বিটওয়াইজ XOR অপারেটর বলা হয়।
বিটওয়াইজ XOR অপারেটর গাণিতিক ব্যাখ্যা
10 = 0000 1010 (বাইনারিতে)
4 = 0000 0100 (বাইনারিতে)
10 এবং 4 এর বিট অপারেশন
0000 1010
^ 0000 0100
________
0000 1110 = 14 (দশকমিকে)
kt_satt_skill_example_id=995
বিটওয়াইজ পূরক(compliment) অপারেটর হলো উনারী(unary) অপারেটর যা কেবল মাত্র একটি অপারেন্ডের উপর কাজ করে। ইহা 1 কে পরিবর্তন করে 0 করে এবং 0 কে পরিবর্তন করে 1 করে। ইহাকে ~ এর মাধ্যমে চিহ্নিত করা হয়।
10 = 0000 1010 (বাইনারিতে) 10 এর বিটওয়াইজ পূরক অপারেটর ~ 0000 1010 ________ 1111 0101 = 245 (দশমিকে)
10 এর বিটওয়াইজ কমপ্লিমেন্ট 245 এর পরিবর্তে -11 হয়েছে। কিন্তু কেন?
কারণ যেকোনো পূর্ণসংখ্যা n এর জন্য বিটিওয়াইজ কমপ্লিমেন্ট -(n+1)
হবে। ইহা বুঝার জন্য আপনাকে প্রথমে 2'স কমপ্লিমেন্ট(Two's complement) সম্মন্ধে জানতে হবে।
বাইনারি সংখ্যায় 2's complement অপারেটর ব্যবহৃত হয়। একটি সংখ্যার 2's complement হলো ঐ সংখ্যার পূরকের সাথে ১ যোগ করলে যা হয় তার সমান। উদাহরনস্বরুপঃ
দশমিক বাইনারি 1's comliment 2's কমপ্লিমেন্ট 0 0000 0000 1111 1111 -(1111 1111+1) = -0000 0000 = -0(দশমিকে) 1 0000 0001 1111 1110 -(1111 1110+1) = -1111 1111 = -255((দশমিকে)) 245 1111 0101 0000 1010 -(0000 1010+1) = -1111 0101 = -11(দশমিকে)
নোটঃ 2'স কমপ্লিমেন্ট এর ক্ষেত্রে হাতের অঙ্ককে অবজ্ঞা করা হয়। অর্থাৎ ১ যোগ করার পরে শেষ অংকে অবশিষ্ট থাকলে তাকে হিসাবের বাইরে রাখা হয়।
10 এর বিটওয়াইজ কমপ্লিমেন্ট 245 এর পরিবর্তে -11 হয়েছে। কারণ 10 এর বিটওয়াইজ কমপ্লিমেন্ট হলো 245 (দশমিকে)। আবার 245 এর 2's complement হলো -11, সুতরাং 245 এর পরিবর্তে -11 আউটপুট হয়েছে।
N এর bitwise complement = ~N (N এর 2's complement ফর্মে)
এবং ~N এর 2'complement = -(~(~N)+1) = -(N+1)
kt_satt_skill_example_id=996
Left shift অপারেটর সমস্ত বিটকে নির্দিষ্ট সংখ্যক বিট বামে সরিয়ে দেয়। ইহাকে << এর মাধ্যমে প্রকাশ করা হয়।
200 = 11010100 (বাইনারিতে)
200<<1 = 1100100000 (বাইনারিতে এবং এক বিট দ্বারা Left shift হয়েছে। )
200<<0 =11010100 (0 বিট দ্বারা Left Shift হয়েছে। )
200<<2 = 1100100000 (বাইনারিতে) =800(দশমিকে)
200<<3 = 11001000000 (bainarite) =1600(দশমিকে)
kt_satt_skill_example_id=997
Right shift অপারেটর সমস্ত বিটকে নির্দিষ্ট সংখ্যক বিট ডানে সরিয়ে দেয়। ইহাকে >> এর মাধ্যমে প্রকাশ করা হয়।
200 = 11001000 (বাইনারিতে)
200>>1 = 01100100 (বাইনারিতে এবং 1 বিট দ্বারা Right shift হয়েছে।)
200>>0 = 11010100 (কোনো শিফট হয়নি)
200>>2 = 00110010 (বাইনারিতে) = 50(দশমিকে)
200>>3 = 00011001 (বাইনারিতে) = 25(দশমিকে)
kt_satt_skill_example_id=999
এই অধ্যায়ে আপনি বৃদ্ধি(increment) এবং হ্রাস(decrement) অপারেটর সম্মন্ধে জানবেন। প্রোগ্রামিং এ increment (++) অপারেটর ভ্যারিয়েবলের ভ্যালু ১ করে বৃদ্ধি করে এবং decrement(--) অপারেটর ভ্যারিয়েবলের ভ্যালু ১ করে হ্রাস করে।
সি increment এবং decrement উভয় অপারেটর সিঙ্গেল অপারেন্ড এ ব্যবহৃত হয়। তাই ইহাকে ইউনারি(unary) অপারেটর বলা হয়। ইউনারি অপারেটর সর্বোচ্চ অগ্রাধিকার বহন করায় অন্য সকল অপারেটরের আগে ইউনারি অপারেটর সম্পাদিত(executed) হয়।
++ // increment operator
-- // decrement operator
increment এবং decrement অপারেটর এর ব্যবহার
মনেকরি, a = 3 তাহলে,
++a; // হবে 4
a++; // হবে 5
--a; // হবে 4
a--; // হবে 3
এখন পর্যন্ত অনেক সহজ মনে হচ্ছে। কিন্তু কিছু গুরুত্বপূর্ণ পার্থক্যও রয়েছে যা আপনাকে জানতে হবে। বিশেষ করে আপনি যখন এই অপারেটর দুটিকে prefix এবং postfix অপারেটর হিসাবে ব্যবহার করবেন তখন আপনার কাছে পার্থক্য প্রতীয়মান হবে।
নোটঃ কনস্ট্যান্টে increment এবং decrement অপারেটর ব্যবহার করা যায় না
a= 5++; // কম্পাইলার error দেখাবে কারণ এখানে 4 হলো constant
- pre-increment
- post-increment
pre-increment এর ক্ষেত্রে প্রথমে ভ্যালু এক বৃদ্ধি পায় তারপরে ক্সপ্রেশনে ব্যবহৃত হয় অথবা অন্য ভ্যারিয়েবলে ইনিশিয়ালাইজ(initialize) হয়।
++ variable;
kt_satt_skill_example_id=1018
post-increment এর ক্ষেত্রে ভ্যারিয়েবলের ভ্যালু প্রথমে এক্সপ্রেশনে ব্যবহৃত হয় অথবা অন্য ভ্যারিয়েবলে ইনিশিয়ালাইজ(initialize) হয় এবং তারপরে ভ্যালু এক বৃদ্ধি পায়।
variable++;
kt_satt_skill_example_id=1021
pre-decrement এর ক্ষেত্রে প্রথমে ভ্যালু এক হ্রাস পায় তারপরে ক্সপ্রেশনে ব্যবহৃত হয় অথবা অন্য ভ্যারিয়েবলে ইনিশিয়ালাইজ(initialize) হয়।
--variable;
kt_satt_skill_example_id=1023
post-increment এর ক্ষেত্রে ভ্যারিয়েবলের ভ্যালু প্রথমে এক্সপ্রেশনে ব্যবহৃত হয় অথবা অন্য ভ্যারিয়েবলে ইনিশিয়ালাইজ(initialize) হয় এবং তারপরে ভ্যালু এক হ্রাস পায়।
variable--;
kt_satt_skill_example_id=1024
common.read_more